我需要在Windows上对一些实时代码进行性能分析。
我无法使用任何常规分析器(Vtune,Codeanalyst),因为我无法减慢可执行文件的速度。所以我使用自己的基于QueryPerformanceCounter()的计时类。
然后是任何现有的(免费)C ++库来记录结果 - 但是我需要将它们缓冲到运行结束,我没有时间写一个文件或事件日志而我是收集数据。
很容易滚动我自己,但如果有一种方法可以将log4cplus / qDebug或类似日志记录到缓冲区并稍后转储它会节省一些精力。
答案 0 :(得分:13)
我写了一个这样做的课程,因为我找不到任何我想要的东西,但仍然很容易融入现有代码中使用复制粘贴编码技术。
(编辑)请注意,正如评论中所提到的,时间行为本身会改变您的时间性质。但是我相信你们都明白这一点。这个课程对我来说,在寻找热点和热点方面仍然非常有用。瓶颈,除了给我至少粗略估计某些代码运行多长时间。我在这里提出的代码是从不打算生产值得。这样使用它。
以下是我班级的示例输出:
Timer Precision = 385 ns
=== Item Trials Ttl Time Avg Time Mean Time StdDev ===
DB Connect 1 0.11 s 0.11 s 0.11 s 0.0000 ps
Entry Parse 3813 0.33 s 86 us 82 us 18 us
File Load 1 50 ms 50 ms 50 ms 0.0000 ps
Option Parse 1 5 ms 5 ms 5 ms 0.0000 ps
Record Update 3812 0.53 s 140 us 127 us 49 us
============================================================================
每个“项目”都是我想要的时间段的一部分。 Timer
对象使用RAII(通过auto_ptr
)来允许自动启动&停。以下是一些示例客户端代码演示如何使用它:
int main(int ac, char* av[])
{
std::auto_ptr<dbg::Timer> section_timer(new dbg::Timer("Option Parse"));
// MAGIC: Parse the command line...
section_timer = auto_ptr<dbg::Timer>(new dbg::Timer("File Load"));
// MAGIC: Load a big file...
section_timer = auto_ptr<dbg::Timer>(new dbg::Timer("DB Connect"));
// MAGIC: Establish a DB connection...
for( /* for each item in the file*/ )
{
section_timer = auto_ptr<dbg::Timer>(new dbg::Timer("Entry Parse"));
// MAGIC: Parse the incoming item
section_timer = auto_ptr<dbg::Timer>(new dbg::Timer("Record Update"));
// MAGIC: Update the database
}
// Dump the output shown above
cout << dbg::Timer::DumpTrials() << endl;
}
此类的实现位于包含库中。你不需要编译任何东西。我使用Boost.Format来进行字符串格式化,但这可以简单地替换。
以下是实现(我的实际实现将其拆分为两个文件core.h
和core_dbg.hpp
;后者直接来自前者{。}}。
#include