为什么C ++和strace不同意open()系统调用正在进行多长时间?

我有一个打开大量文件的程序。 我计时执行一个C ++循环,它实际上只是打开和closures使用C ++定时器和strace的文件。 奇怪的是,系统时间和C ++logging的时间(相互一致)比系统调用声明花费的时间要大得多。 怎么会这样? 我已经把源和输出下面。

这一切都是因为我发现我的应用程序花费了不合理的时间来打开文件。 为了帮助我把这个问题写下来,我写了下面的testing代码(用于引用文件“files.csv”只是每行有一个文件path的列表):

#include <stdio.h> #include... using namespace std; int main(){ timespec start, end; ifstream fin("files.csv"); string line; vector<string> files; while(fin >> line){ files.push_back(line); } fin.close(); clock_gettime(CLOCK_MONOTONIC, &start); for(int i=0; i<500; i++){ size_t filedesc = open(files[i].c_str(), O_RDONLY); if(filedesc < 0) printf("error in open"); if(close(filedesc)<0) printf("error in close"); } clock_gettime(CLOCK_MONOTONIC, &end); printf(" %fs elapsed\n", (end.tv_sec-start.tv_sec) + ((float)(end.tv_nsec - start.tv_nsec))/1000000000); return 0; } 

这是我运行时得到的结果:

 -bash$ time strace -ttT -c ./open_stuff 5.162448s elapsed <------ Output from C++ code % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 99.72 0.043820 86 508 open <------output from strace 0.15 0.000064 0 508 close 0.14 0.000061 0 705 read 0.00 0.000000 0 1 write 0.00 0.000000 0 8 fstat 0.00 0.000000 0 25 mmap 0.00 0.000000 0 12 mprotect 0.00 0.000000 0 3 munmap 0.00 0.000000 0 52 brk 0.00 0.000000 0 2 rt_sigaction 0.00 0.000000 0 1 rt_sigprocmask 0.00 0.000000 0 1 1 access 0.00 0.000000 0 1 execve 0.00 0.000000 0 1 getrlimit 0.00 0.000000 0 1 arch_prctl 0.00 0.000000 0 3 1 futex 0.00 0.000000 0 1 set_tid_address 0.00 0.000000 0 1 set_robust_list ------ ----------- ----------- --------- --------- ---------------- 100.00 0.043945 1834 2 total real 0m5.821s <-------output from time user 0m0.031s sys 0m0.084s 

从理论上讲,从C ++报告的“经过”时间应该是开放调用的执行时间(2)加上执行for循环500次的最小开销。 然而,开放式(2)和闭式(1)通话的时间总和缩短了99%。 我无法弄清楚发生了什么事情。

PS C经过时间和系统时间之间的差异是由于files.csv实际上包含数以万计的path,这些path都被加载。

经过时间和执行时间的比较就像比较苹果和橙汁。 (其中一个缺少纸浆:))要打开一个文件,系统必须找到并读取相应的目录条目…并且如果路径很深,则可能需要排列许多目录条目。 如果条目未被缓存,则需要从磁盘读取,这将涉及磁盘搜索。 虽然磁盘磁头正在移动,而扇区正在旋转到磁头的位置,挂钟仍在滴答,但CPU可以做其他的事情(如果有工作要做)。 – 无情的时钟打 – 但不是执行时间。