我的电脑有两个处理器,我知道每个处理器的运行频率为 1.86 GHz。
我想手动测量我的 PC 处理器的时钟脉冲,我的想法只是计算程序所具有的汇编器行数与我的计算机执行它所花费的时间之间的商,所以我得到了数字CPU 每次处理的汇编指令数(这就是我对“时钟周期”的理解)。我想按以下方式进行:
- 我编写了一个 C 程序并将其转换为汇编代码。
- I do:
$gcc -S my_program.c
,它告诉 gcc 编译器执行整个编译过程,除了最后一步:将 my_program.c 转换为二进制对象。因此,我有一个名为 my_program.s 的文件,其中包含翻译为汇编代码的 C 程序源代码。 我计算程序的行数(我们称这个数字为 N)。我做到了:
$ nl -l my_program.s | tail -n 1
并且我获得了以下内容:1000015 .section .note.GNU-stack,"",@progbits
也就是说,该程序有一百万行代码。
- 我这样做:
$gcc my_program.c
这样我就可以执行它。 我这样做:(
$time ./a.out
“a.out”是 my_program.c 的二进制对象的名称)用于获取运行程序所花费的时间(我们称之为 T),我得到:real 0m0.059s user 0m0.000s sys 0m0.004s
假设我正在搜索的时间 T 是列表中表示的第一个时间:“真实”,因为其他时间引用了在我执行的同一时刻在我的系统中运行的其他资源./a.out
。
所以我有 N=1000015 行和 T=0.059 秒。如果我进行 N/T 除法,我得到的频率接近 17 MHz,这显然是不正确的。
然后我想,也许我的计算机上运行着其他程序并消耗硬件资源(不进一步,操作系统本身)这一事实使得处理器“分割”其“处理能力”,并且它确实使时钟脉冲消失慢一些,但我不确定。
但我认为,如果这是正确的,我还应该找到我的程序消耗的 CPU 资源(或内存)的百分比,因为这样我就可以真正渴望获得关于我的真实 CPU 速度的(很好)近似结果。
这就引出了如何找出我的程序的“资源消耗值”的问题。我想过这个$ top
命令,但由于我的程序执行时间很短(0.059秒),它立即被丢弃;无法通过简单的视觉来区分这段时间内内存使用的任何峰值。
所以,对于这个你有什么想法?或者你建议我做什么?我知道有些程序可以完成我尝试做的这项工作,但我更喜欢使用原始 bash 来完成它,因为我有兴趣通过最“通用的方式”来完成它(看起来更可靠)。
答案1
那是行不通的。每条指令执行所需的时钟周期数(它们需要相当多的时钟周期,而不仅仅是一个)在很大程度上取决于它周围的指令的确切组合,并且因具体的 CPU 型号而异。您还会收到中断,并且内核和其他任务会与您的指令混合执行指令。最重要的是,频率会根据负载和温度动态变化。
现代 CPU 具有特定于型号的寄存器,可以精确计算时钟周期数。您可以读取此内容,并使用高分辨率计时器,在固定时间段后再次读取它,然后比较两者以找出该时间段内的(平均)频率。