user2013868
user2013868

Reputation: 31

measuring number of execl

I want to measure the number of execl call per second, but my script terminates after first iteration because execl has a leave function built in!

I want to know how I can return to my script or find a way to count:

t_end = time.time() + 60
counter = 0
while time.time() < t_end:
    def execlNum():
        os.execl('script.py' 'script.py', '0')

    execlNum()
    counter = counter+1
print counter/60

Upvotes: 0

Views: 91

Answers (2)

Matteo Italia
Matteo Italia

Reputation: 126837

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;
}

Upvotes: 2

Michał Fita
Michał Fita

Reputation: 1329

You've made totally wrong assumption about the execl() call. This system call doesn't have any "leave function built in" how you named it, but it effectively replace the current process with new executable code loaded from the file pointed by first argument to this function.

So, the short answer is you can't.

You need to redefine your problem in new way.

Upvotes: 0

Related Questions