C ++日志和性能调优库

时间:2011-01-18 17:21:38

标签: c++ performance logging

我需要在Windows上对一些实时代码进行性能分析。

我无法使用任何常规分析器(Vtune,Codeanalyst),因为我无法减慢可执行文件的速度。所以我使用自己的基于QueryPerformanceCounter()的计时类。

然后是任何现有的(免费)C ++库来记录结果 - 但是我需要将它们缓冲到运行结束,我没有时间写一个文件或事件日志而我是收集数据。

很容易滚动我自己,但如果有一种方法可以将log4cplus / qDebug或类似日志记录到缓冲区并稍后转储它会节省一些精力。

1 个答案:

答案 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.hcore_dbg.hpp;后者直接来自前者{。}}。

实现:

#include