c++ - 如何评估程序的运行时?

标签 c++ profile

我已经开发了一个简单的程序,并希望在实际计算机上评估其运行时性能,例如我的MacBook。
源代码为:

#include <stdio.h>
#include <vector>
#include <ctime>

int main () {
    auto beg = std::clock () ;
    for (int i = 0; i < 1e8; ++ i) {

    }
    auto end = std::clock () ;
    printf ("CPU time used: %lf ms\n", 1000.0*(end-beg)/CLOCKS_PER_SEC) ;
}

它使用gcc编译,并且优化标志设置为默认值。
在bash脚本的帮助下,我运行了1000次,并通过MacBook记录了运行时间,如下所示:
[130.000000, 136.000000): 0
[136.000000, 142.000000): 1
[142.000000, 148.000000): 234
[148.000000, 154.000000): 116
[154.000000, 160.000000): 138
[160.000000, 166.000000): 318
[166.000000, 172.000000): 139
[172.000000, 178.000000): 40
[178.000000, 184.000000): 11
[184.000000, 190.000000): 3

“[a,b):n”表示同一程序的实际运行时间在a毫秒与b毫秒之间,持续n次。

显然,实际的运行时变化很大,并且似乎不是正态分布。有人可以告诉我是什么原因造成的,以及如何正确评估运行时间?

感谢您回答这个问题。

最佳答案

基准测试很难!

简短答案:使用google benchmark

长答案:
有很多事情会干扰时间安排。

  • 计划(操作系统代替您运行其他事情)
  • CPU扩展(操作系统决定它可以通过降低运行速度来节省能源)
  • 内存争用(想要使用内存的其他方式)
  • 总线争用(与您要交谈的设备通话的其他方式)
  • 高速缓存(CPU保留一个值以避免使用内存)
  • CPU迁移。 (操作系统将您从一个CPU转移到另一个CPU)
  • 时钟不准确(仅CPU时钟在任何程度上都是准确的,但是如果您迁移,它们会更改)

  • 避免这些影响的唯一方法是禁用CPU缩放,执行“缓存刷新”功能(通常在启动前仅触摸大量内存),高优先级运行以及将自己锁定在单个CPU上。即使如此,您的时间安排仍然很嘈杂,所以最后一件事就是重复很多,并使用平均值。
    这就是为什么google benchmark之类的工具可能是您最好的选择。

    video from CPPCon
    也可以使用现场online

    关于c++ - 如何评估程序的运行时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60756970/

    相关文章:

    liferay - 如何在 Liferay 中检索用户个人资料图片

    C++ 继承 protected 成员

    c++ - 回到 C++(工具、调试器、环境、编译器)?

    c++ - Qt 中的文件选择

    ios - 更新 iOS 设备上现有 MDM 配置文件中的 ServerURL

    C# Web 应用程序调优 : PerformWaitCallback

    spring-mvc - Spring MVC application.properties 未被配置文件 application-dev.properties 覆盖

    python - Django-Registration & Django-Profile,使用你自己的自定义表单

    c++ - AABB Collision response(推回碰撞物体)

    c++ - 函数存储在内存的哪一段?