【问题标题】:Dealing with heavy profiling of execution times in C++处理 C++ 中执行时间的繁重分析
【发布时间】:2017-07-16 09:43:13
【问题描述】:

我目前正在从事一个涉及海量数据和复杂算法的科学计算项目,因此我需要进行大量代码分析。我目前依靠<ctime>clock_t 来计时我的代码的执行。我对这个解决方案非常满意……除了我基本上是在计时,因此对于每一行真实代码,我必须调用start_time_function123 = clock()end_time_function123 = clock()cout << "function123 execution time: " << (end_time_function123-start_time_function123) / CLOCKS_PER_SEC << endl。这会导致严重的代码膨胀,并很快使我的代码变得不可读。你会怎么处理呢?

我能想到的唯一解决方案是找到一个允许我标记部分代码(在不同位置,甚至在不同文件中)的 IDE,并通过一个按钮切换隐藏/显示所有标记的代码。这将允许我在大部分时间隐藏与分析相关的代码部分,并仅在我想要的时候显示它。

【问题讨论】:

  • 您可以使用上述代码创建一个开始和结束函数,并在需要时调用它们。
  • 你应该看看std::chrono
  • std::chrono 如何回答我的问题?
  • 什么操作系统?什么编译器和版本?你不能使用分析工具(如gprof(1)oprofile 吗?)在Linux 上阅读仔细 time(7)
  • 您应该投资一个工具,而不是手动检测您的源以进行分析。

标签: c++ performance time profiling


【解决方案1】:

具有将代码标记为定时的 RAII 类型。

struct timed {
  char const* name;
  clock_t start;
  timed( char const* name_to_record):
    name(name_to_record),
    start(clock())
  {}
  ~timed(){
    auto end=clock();
    std::cout << name << " execution time: " << (end-start) / CLOCKS_PER_SEC << std::endl;
  }
};

使用它:

void foo(){
  timed timer(__func__);
  // code
}

噪音小得多。

您可以使用基于非范围的完成操作进行扩充。在进行大量分析时,有时我喜欢包含唯一 ID。将 cout esoecially 与 endl 一起使用可能会导致它在时间上占主导地位;快速记录到以异步方式转储的大缓冲区可能是最佳选择。如果需要对 ms 级时间进行计时,则应避免分配、锁定和字符串操作。

【讨论】:

    【解决方案2】:

    您没有这么明确地说,但我假设您正在寻找可能的加速 - 减少所需时间的方法。

    您认为您需要通过测量不同部分所花费的时间来做到这一点。如果你有兴趣,有一种正交的方法可以接近它。

    只需让它在调试器下运行(使用未优化的调试版本)。 通过 Ctrl-C、Ctrl-Break 或 IDE 的“暂停”按钮随机手动中断它。 显示调用堆栈并仔细检查程序在各个级别上正在执行的操作。

    这样做时要怀疑它所做的任何事情都可能是一种浪费,您可以找到更好的方法来做。

    然后,如果您再次启动它,然后再次停止它,并看到它做同样的事情或类似的事情,您知道如果您修复它,您将获得显着的加速。 您为两次查看该事物而采取的样本越少,您获得的速度就越快。

    这就是random pausing 技术,统计原理是here。 您在调试版本中执行此操作的原因是here。 使用此方法减脂后,您可以切换到优化的构建并获得它为您提供的额外利润。

    【讨论】:

    • 非常感谢,这很有趣!但是我不同意在调试模式下进行分析的想法:我只想优化我的代码的瓶颈,并且发布模式/优化标志提供的加速因子对于所有部分绝对不一样程序,那么调试模式下的分析如何帮助我找到我的代码的瓶颈是什么?
    • @Adrien:因为正如该链接所解释的那样,优化器只能加速调用堆栈底部的事情,并且只有当它们位于编译器实际看到的非库代码中时。它可以优化更高的东西,但程序计数器在那里花费的时间很少。它可以做的是很难找到只有才能解决的加速问题,例如不必要的内存分配、需要记忆的函数、需要特殊大小写的函数等等。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多