Библиотека журналирования и настройки производительности C ++ - PullRequest
12 голосов
/ 18 января 2011

Мне нужно проанализировать производительность кода в реальном времени в Windows.

Я не могу использовать ни один из обычных профилировщиков (Vtune, Codeanalyst), потому что не могу замедлить исполняемый файл. Поэтому я использую свой собственный класс синхронизации, основанный на QueryPerformanceCounter ().

Есть ли какие-либо существующие (бесплатные) библиотеки C ++ для регистрации результатов - НО мне нужно, чтобы они были буферизованы до конца прогона, я не могу позволить себе время записи в файл или журнал событий, пока я сбор данных.

Достаточно легко свернуть мой собственный файл, но если есть способ сделать log4cplus / qDebug или аналогичный журнал в буфер и выгрузить его позже, это сэкономит некоторые усилия.

1 Ответ

13 голосов
/ 18 января 2011

Я также написал класс, который делает это, потому что я не мог найти ничего, что делало бы то, что я хотел, но было все еще легко включить в существующий код с помощью методов кодирования с копированием-вставкой.

(edit) Обратите внимание, что, как уже упоминалось в комментариях, сам процесс синхронизации меняет природу того, что вы синхронизируете.Но тогда я уверен, что вы понимаете это слишком хорошо.Этот класс все еще был очень полезен для меня в поиске горячих точек и узких мест, в дополнение к тому, что я дал хотя бы приблизительную оценку того, сколько времени займет выполнение определенного кода.Код, который я здесь представляю, был никогда , предназначенным для производства.Используйте его как таковой.

Вот пример выходных данных моего класса:

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; последний* *

* * * * * * * * * * * * * * * * * * * *

* *.

...