测量进程消耗的CPU时钟

我在C编写了一个程序。它是一个由研究创建的程序。 我想计算程序消耗的精确CPU周期。 确切的周期数。 知道我怎么能找到它?

valgrind工具cachegrindvalgrind --tool=cachegrind )将为您提供详细的输出,包括执行的指令数,缓存未命中和分支预测未命中。 这些可以归结为汇编程序的各个行,因此原则上(了解您的确切架构)您可以从此输出中获得精确的循环计数。

知道由于缓存效应,它会从执行变为执行。

cachegrind工具的文档在这里 。

不,你不能。 “CPU周期”的概念尚未明确定义。 现代芯片可以以多种时钟速率运行,并且它们的不同部分可以在不同时间执行不同的操作。

在某些情况下,“有多少总管道步骤”的问题可能是有意义的,但是不太可能有办法实现它。

试试OProfile 。 它使用CPU上的各种硬件计数器来测量执行的指令数和已经过的循环数。 您可以在文章内存部分7:内存性能工具中看到它的一个示例。

我并不完全确定我确切知道你要做什么,但是现代x86处理器可以做的是在你感兴趣的代码块之前和之后读取时间戳计数器 (TSC)。汇编级别,这是使用RDTSC指令完成的,该指令为您提供edx:eax寄存器对中TSC的值。

但请注意,这种方法有一些注意事项,例如,如果您的进程从CPU0开始并最终在CPU1上,则从RDTSC获得的结果将指向执行该指令的特定处理器内核,因此可能无法比较。 (还有缺少RDTSC的指令序列化,但在这种情况下,我不认为这是一个很大的问题。)

对不起,但不,至少不是出于大多数实际目的 – 大多数普通操作系统根本不可能。 例如,相当多的操作系统不执行完整的上下文切换来处理中断,因此服务中断所花费的时间通常似乎是在中断发生时执行的任何进程中花费的时间。

“不用于实际目的”表示在循环精确模拟器下运行程序的可能性。 这些都是可用的,但主要用于主要用于实时嵌入式系统的CPU,而不是像完整的PC那样。 更糟糕的是,它们(通常)不是用于运行完整的操作系统,而是用于运行在“裸机”上的代码。

从理论上讲,您可能可以使用运行Windows或Linux等function的虚拟机执行某些操作 – 但我不知道任何现有的虚拟机是否会尝试,而且这些虚拟机肯定是非常重要的,并且可能非常严重绩效的后果(温和地说)。