如何计算C中fork()系统调用的运行时间?
我试图找到fork()
系统调用的运行时间。每个子进程需要立即退出,并且在创建下一个子进程之前父进程需要对wait()
。我还想使用名为time
的shell内置命令来测量程序的执行时间。如何计算C中fork()系统调用的运行时间?
到目前为止我有这个代码,但不知道如果我做对了。
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int global = 100;
int main(int argc, char** argv)
{
int local = 5;
pid_t pid;
pid = fork();
if (pid < 0) {
fprintf(stderr, "error -- failed to fork()");
return 1;
}
if (pid > 0) {
int child_ret;
waitpid(pid, &child_ret, 0);
printf("parent -- global: %i, local: %i\n", global, local);
printf("parent -- child exited with code %i\n", child_ret);
} else {
global++;
local++;
printf("child -- global: %i, local: %i\n", global, local);
exit (0);
}
}
阅读第一time(7),并考虑使用clock_gettime(2) & getrusage(2);如果您只需要测量系统调用本身的时间(它非常小 - 也许是毫秒 - 并且不是真正重要),则可以在fork
(在父进程中)周围使用clock_gettime
。
在故障情况下使用errno
(例如,打印strerror(errno)
或使用perror
)。
请注意,fork
时间可能会略微取决于您的virtual address space和resident set size的大小。你也可以使用strace
时机;在实践中fork
足够快(通常,小于一毫秒,有时几十微秒的,因为它是用懒惰copy-on-write技术)
所以fork
快,孩子execve
可能需要几微秒,孩子中的程序启动时间也很重要(ld-linux(8)正在执行一些relocation,然后的exec
-ed程序启动......)。 什么准确你想衡量?
一般来说,子进程很快跟execve(2)这也需要一定的时间(当然还有执行的程序可能需要一段任意长的时间才能完成,并且可能甚至“从来没有”完成,如果它是服务器等)。也许最重要的是fork
之间的时间和子过程中execve
-d main
的第一个有意义的指令......
事实上,你可以启动很多进程;经验法则是fork
每秒最多几百倍,且仅当孩子快速execve
-ing一些快速程序(如的几十个文件/bin/ls
,或date
)。但是,您不希望一次(在笔记本电脑或台式机上)运行多个或两个以上的进程,甚至可能少于5个可运行进程...
请查看' getrusage'系统调用。 – Kaz
代码是否工作?如果是的话,你应该在codereview.stackexchange.com上发布。如果代码不起作用,请准确地说出您的想法:您观察到什么错误或意外行为? –
你很可能会感到困惑,因为'local'和'global'不会改变你的父进程,但是,你的代码看起来是正确的。 – tkausl