处理C ++中执行时间的大量分析

时间:2017-02-25 14:58:07

标签: c++ performance time profiling

我目前正在研究涉及大量数据和复杂算法的科学计算项目,因此我需要进行大量的代码分析。我目前依靠<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,允许我标记部分代码(在不同的位置,甚至在不同的文件中),并用一个按钮切换隐藏/显示所有标记的代码。这将允许我隐藏与大多数时间分析相关的代码部分,并且只在我想要的时候显示它。

2 个答案:

答案 0 :(得分:7)

具有将代码标记为定时的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。与endl一起使用cout可能会导致它占主导地位;快速记录到以异步方式转储的大缓冲区可能是最佳的。如果你需要时间ms级别的时间,应该避免分配,锁和字符串操作。

答案 1 :(得分:1)

你没有明确说出来,但我认为你正在寻找可能的加速 - 减少所需时间的方法。

您认为您需要通过测量不同部分所花费的时间来完成此操作。如果您有兴趣,可采用正交的方法来接近它。

让它在调试器下运行(使用非优化的调试版本)。 通过Ctrl-C,Ctrl-Break或IDE&#34;暂停&#34;手动中断它。按钮。 显示调用堆栈并仔细检查程序在所有级别上正在执行的操作。

这样做是因为怀疑无论做什么都可能是浪费,你可以找到更好的方法。

然后,如果你再次启动它,并再次停止它,并看到它做同样的事情或类似的东西,你知道如果你修复它将获得大幅加速。 你用两次看到那个东西的样本越少,你获得的加速就越快。

这是random pausing技术,统计理由是here。 您在调试版本上执行此操作的原因是here。 在您使用此方法切除脂肪后,您可以切换到优化的构建并获得它给您的额外余量。