Минималистичный способ копирования и вставки + ленивое использование
Если идея состоит в том, чтобы иметь минималистичную структуру, которую вы можете использовать для быстрых тестов, тогда я предлагаю вам просто скопировать и вставить в любое место файла C ++ сразу после #include
. Это единственный случай, когда я жертвую форматированием в стиле Allman.
Вы можете легко настроить точность в первой строке структуры. Возможные значения: nanoseconds
, microseconds
, milliseconds
, seconds
, minutes
или hours
.
#include <chrono>
struct MeasureTime
{
using precision = std::chrono::microseconds;
std::vector<std::chrono::steady_clock::time_point> times;
std::chrono::steady_clock::time_point oneLast;
void p() {
std::cout << "Mark "
<< times.size()/2
<< ": "
<< std::chrono::duration_cast<precision>(times.back() - oneLast).count()
<< std::endl;
}
void m() {
oneLast = times.back();
times.push_back(std::chrono::steady_clock::now());
}
void t() {
m();
p();
m();
}
MeasureTime() {
times.push_back(std::chrono::steady_clock::now());
}
};
Использование
MeasureTime m; // first time is already in memory
doFnc1();
m.t(); // Mark 1: next time, and print difference with previous mark
doFnc2();
m.t(); // Mark 2: next time, and print difference with previous mark
doStuff = doMoreStuff();
andDoItAgain = doStuff.aoeuaoeu();
m.t(); // prints 'Mark 3: 123123' etc...
Стандартный результат вывода
Mark 1: 123
Mark 2: 32
Mark 3: 433234
Если вы хотите получить резюме после выполнения
Если вам нужен отчет позже, потому что, например, ваш промежуточный код также записывает в стандартный вывод. Затем добавьте следующую функцию в структуру (непосредственно перед MeasureTime ()):
void s() { // summary
int i = 0;
std::chrono::steady_clock::time_point tprev;
for(auto tcur : times)
{
if(i > 0)
{
std::cout << "Mark " << i << ": "
<< std::chrono::duration_cast<precision>(tprev - tcur).count()
<< std::endl;
}
tprev = tcur;
++i;
}
}
Итак, вы можете просто использовать:
MeasureTime m;
doFnc1();
m.m();
doFnc2();
m.m();
doStuff = doMoreStuff();
andDoItAgain = doStuff.aoeuaoeu();
m.m();
m.s();
Который будет перечислять все метки, как и раньше, но затем после выполнения другого кода. Обратите внимание, что вы не должны использовать оба m.s()
и m.t()
.