gpt4 book ai didi

linux - 为什么运行一个空程序需要这么多指令?

转载 作者:行者123 更新时间:2023-12-01 03:17:59 25 4
gpt4 key购买 nike

所以最近我了解到perf linux下的命令。我决定运行一些实验,因此我创建了一个空的 c 程序并测量了运行所需的指令数:

echo 'int main(){}'>emptyprogram.c && gcc -O3 emptyprogram.c -o empty
perf stat ./empty

这是输出:
 Performance counter stats for './empty':

0.341833 task-clock (msec) # 0.678 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
112 page-faults # 0.328 M/sec
1,187,561 cycles # 3.474 GHz
1,550,924 instructions # 1.31 insn per cycle
293,281 branches # 857.966 M/sec
4,942 branch-misses # 1.69% of all branches

0.000504121 seconds time elapsed

为什么它使用这么多指令来运行一个实际上什么都不做的程序?我想这可能是将程序加载到操作系统所需的一些基线指令数,所以我寻找了一个用汇编编写的最小可执行文件,我找到了一个 142 字节的可执行文件,输出 "Hi World"这里 ( http://timelessname.com/elfbin/ )

在 142 字节的 hello 可执行文件上运行 perf stat,我得到:
Hi World

Performance counter stats for './hello':

0.069185 task-clock (msec) # 0.203 CPUs utilized
0 context-switches # 0.000 K/sec
0 cpu-migrations # 0.000 K/sec
3 page-faults # 0.043 M/sec
126,942 cycles # 1.835 GHz
116,492 instructions # 0.92 insn per cycle
15,585 branches # 225.266 M/sec
1,008 branch-misses # 6.47% of all branches

0.000340627 seconds time elapsed

这似乎仍然比我预期的要高很多,但我们可以接受它作为基准。在那种情况下,为什么运行 empty需要多 10 倍的指令?这些指令做了什么?如果它们是某种开销,为什么 C 程序和 helloworld 汇编程序之间的开销差异如此之大?

最佳答案

声称它“实际上什么都不做”是不公平的。是的,在应用程序级别,您选择让整个事情成为您的微基准测试的巨大空操作,这很好。但是不,在系统级别的幕后,它几乎不是“什么都没有”。你让 linux fork 出一个全新的执行环境,初始化它,并将它连接到环境。您调用了很少的 glibc 函数,但动态链接并非易事,经过一百万条指令后,您的进程已准备好要求故障 printf() 和 friend ,并有效地引入您可能已链接或 dlopen() 的库。

这不是实现者可能会优化的那种微平台。有趣的是,您是否可以识别在某些用例中从未使用过的 fork/exec 的“昂贵”方面,因此在非常特定的情况下可能会被 #ifdef 退出(或使其执行短路)。对 resolv.conf 的惰性求值就是一个例子,如果一个进程从不与 IP 服务器交互,它就永远不会支付开销。

关于linux - 为什么运行一个空程序需要这么多指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47724328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com