Я также написал класс, который делает это, потому что я не мог найти ничего, что делало бы то, что я хотел, но было все еще легко включить в существующий код с помощью методов кодирования с копированием-вставкой.
(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
; последний* *
* * * * * * * * * * * * * * * * * * * *
* *.