[英]How to calculate run time for fork() system call in C?
我正在嘗試查找fork()
系統調用的運行時間。 每個子進程都需要立即退出,父進程需要在每個子進程上創建之前先對其進行wait()
。 我還想使用名為time
的shell內置命令來衡量程序的執行時間。
到目前為止,我已經有了這段代碼,但是不確定我是否做對了。
#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);
}
}
閱讀第一時間(7)並考慮使用clock_gettime(2)和getrusage(2) ; 如果您只想測量fork(2) syscall本身的時間(它非常小-可能是一毫秒-並不重要),則可以在fork
(在父進程中)周圍使用clock_gettime
。
在失敗的情況下使用errno
(例如print strerror(errno)
或使用perror
)。
請注意, fork
時間可能會稍微取決於您的虛擬地址空間的 大小和駐留集的大小 。 您可能還會使用strace
計時功能; 實際上, fork
是足夠快的(通常少於一毫秒,有時幾十微秒;因為它使用了懶惰的寫時復制技術)
所以fork
快,孩子execve
可能需要幾個微秒,程序啟動時在孩子的時間也顯著( LD-Linux操作系統(8)正在執行一些搬遷之前,你的main
的的exec
-ed程序啟動... )。 您到底要測量什么?
通常,子進程會快速調用execve(2) ,這也需要一些時間(當然,執行的程序可能需要花費任意長時間才能完成,如果像服務器一樣,甚至可能“永不”完成)。 可能重要的是fork
之前到子進程中execve
-d程序的main
中的第一條有意義的指令之間的時間...
實際上,您可以啟動許多流程。 經驗法則是,以fork
以每秒最多幾百倍,且僅當孩子很快 execve
-ing一些快速的程序(如/bin/ls
的幾十個文件,或date
)。 但是,您不希望一次(在便攜式計算機或台式機上)擁有一打或十二個以上的可運行進程,甚至可能少於五個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.