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