如何计算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); 
    } 
} 
+2

请查看' getrusage'系统调用。 – Kaz

+0

代码是否工作?如果是的话,你应该在codereview.stackexchange.com上发布。如果代码不起作用,请准确地说出您的想法:您观察到什么错误或意外行为? –

+0

你很可能会感到困惑,因为'local'和'global'不会改变你的父进程,但是,你的代码看起来是正确的。 – tkausl

阅读第一time(7),并考虑使用clock_gettime(2) & getrusage(2);如果您只需要测量系统调用本身的时间(它非常小 - 也许是毫秒 - 并且不是真正重要),则可以在fork(在父进程中)周围使用clock_gettime

在故障情况下使用errno(例如,打印strerror(errno)或使用perror)。

请注意,fork时间可能会略微取决于您的virtual address spaceresident 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个可运行进程...