我想测量每秒execl调用的次数,但是我的脚本在第一次迭代后终止,因为execl有一个内置的leave函数!
我想知道如何才能返回到我的脚本,或者找到一种计算方法:
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发布于 2015-11-26 06:25:19
因为exec用您指定的映像替换了当前的可执行映像,所以您不能在循环中这样做-您可以说execl实际上永远不会返回(当它成功时),因为您当前的代码不再存在。
如果你想测量每秒你能做的execl的数量,你可以这样做:
#!/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"但请记住,这不仅仅是对实际exec时间(根据操作系统的需要)的基准测试,更像是对Python启动时间(以及编译此脚本所需时间)的基准测试;在我的机器上,此脚本输出58.8exec/秒,而其简单的C转换(见下文)产生1484.2 exec/秒。
#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;
}发布于 2015-11-26 05:37:02
您对execl()调用做出了完全错误的假设。这个系统调用没有任何您命名的"leave function内置“,但它有效地将当前进程替换为从该函数的第一个参数所指向的文件加载的新可执行代码。
所以,简短的答案是你不能。
你需要用新的方式重新定义你的问题。
https://stackoverflow.com/questions/33926243
复制相似问题