有没有好的方法来做到这一点?有工具或文档吗?我的代码是用gcc在x86架构上编译的。
有没有好的方法来做到这一点?有工具或文档吗?我的代码是用gcc在x86架构上编译的。
rdtsc
(读取时间戳计数器),将当前CPU自上次重置后的时钟周期计数以EDX:EAX寄存器返回。如果您的CPU运行速度为3GHz,则一个时钟周期为1/3GHz。QueryPerformanceFrequency
会返回每秒的时钟周期数。如果您想比较性能,最简单的方法是将您的算法放入循环中并运行1000或1000000次。
一旦您运行了足够多的次数以便看到小差异,请运行time ./my_program
,这将给出它使用的处理器时间。
多做几次以获取样本并比较结果。
尝试计算指令对于x86架构没有帮助。这是因为不同的指令执行所需的时间可能会有显着差异。
使用 gcc -S your_program.c
命令。 -S
参数告诉 gcc 生成汇编代码清单,文件名为 your_program.s
。
有很多高性能的时钟可用。QueryPerformanceCounter是微软的。一般的技巧是运行函数数万次并计算所需时间。然后将所花费的时间除以循环次数。你会发现每个循环所需的时间略有不同,因此通过多次测试才能真正找出所需时间。
这并不是一个简单的问题。让我试着解释一下:
在不同操作系统上有几个工具可以做到你想要的,但这些工具通常是更大环境的一部分。每个指令都会被翻译成一定数量的周期,这取决于编译器运行的 CPU 和程序执行的 CPU。
我无法给出明确的答案,因为我没有足够的数据来做出判断,但我在 IBM 数据库领域工作,我们使用工具来测量代码的周期和指令,这些跟踪仅对程序编译和运行的实际 CPU 有效。
根据您的 CPU 管道的内部结构和编译器的效率,生成的代码很可能仍然存在缓存未命中和其他需要关注的区域。(在这种情况下,您可能需要考虑 FDPR...)
如果您想知道您的程序在您的 CPU 上(使用您的编译器编译)需要多少个周期才能运行,您必须了解 CPU 的工作原理以及编译器如何生成代码。
很抱歉,如果答案对解决你手头的问题不够满意。你说你正在使用gcc在x86架构上。我建议你尝试将汇编代码映射到你的CPU上。 我相信你会发现一些地方,gcc可能做得更好...