Since exec
replaces the current executable image with the one you specified, you cannot do it in a loop - you could say that execl
actually never returns (when it succeeds), since your current code ceases to exists.
If you want to measure the number of execl
you can do per second you could do something like this:
#!/usr/bin/env python2
import time
import sys
import subprocess
import os
# duration of our benchmark
duration = 10
# time limit
limit = time.time() + duration
count = 0
# if we are in the "execl-ed process", take the arguments from the command line
if len(sys.argv)==3:
limit = float(sys.argv[1])
# increment the counter
count = int(sys.argv[2])+1
# if we have time, do another execl (passing the incremented counter)
if time.time()<limit:
os.execl('execpersec.py', 'execpersec.py', str(limit), str(count))
# if we get here, it means that the 10 seconds have expired; print
# how many exec we managed to do
print count/float(duration), "exec/sec"
But keep in mind that this, more than benchmarking the actual exec
time (as needed by the OS), is more like a benchmark of the startup time of Python (and of the time needed to compile this script); on my machine this script outputs 58.8 exec/sec, while its straightforward C translation (see below) yields 1484.2 exec/sec.
#include <sys/time.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int duration = 10;
double mytime() {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + tv.tv_usec*1E-6;
}
int main(int argc, char *argv[]) {
const double duration = 10;
double limit = mytime() + duration;
long count = 0;
if(argc==3) {
limit = atof(argv[1]);
count = atol(argv[2])+1;
}
if(mytime()<limit) {
char buf_limit[256], buf_count[256];
sprintf(buf_limit, "%f", limit);
sprintf(buf_count, "%ld", count);
execl("./execpersec.x", "./execpersec.x", buf_limit, buf_count, NULL);
}
printf("%f exec/sec\n", count/duration);
return 0;
}