Иногда я встречаюсь с ситуациями когда нужно написать тот или иной код, который часто попадается в среднестатистических проектах.
Однако обычно он считается слишком маленьким чтобы создавать отдельную библиотеку для него и сохранять на будущее.
Сейчас я всё-таки решил что будет полезно по ходу дела выделять такие коды в отдельные файлы и выкладывать их сюда, может кому-нибудь они тоже часто бывают нужны.
Было бы неплохо поместить такие коды в отдельный раздел.
В одну тему складывать не очень удобно, т. к. они могут обновляться и по ним могут задаваться вопросы -- будет путаница.
В название темы написал booleanstd чтобы потом такие темы легко искались через поиск.
Код я поместил в namespace boolean.
Высокоточный счётчик времени (наносекунды).
highFreqCounter.hpp.txt v. 0.5.1.a, Linux, C++14
Алгоритм подсчёта общей суммы и среднего значения.
averageValue.hpp.txt v. 0.5.1.a, Linux, C++14
Пример использования highFreqCounter.
Считаем кол-во времени затраченного на вызов функции foo().
...
// Главный цикл приложения.
while ( 1 ) {
// Создаём счётчик.
// Про clockid_t можно прочитать здесь.
boolean::highFreqCounter hfc { CLOCK_MONOTONIC };
hfc.begin(); // Начинаем считать.
foo(); // Вызываем тестируемый код.
hfc.end(); // Заканчиваем считать.
// Получаем количество в наносекундах
// (лучше использовать int64_t чтобы уместилось больше 2 секунд).
const int64_t time { hfc.nsecGetTime() };
}
...
Пример использования averageValue.
Считаем количество кадров в секунду.
...
// Главный цикл приложения.
while ( 1 ) {
...
// Следующий код можно написать где-то в конце прохода цикла.
// Создаем fpsCounter.
// uint32_t подойдет для подсчёта кадров.
static boolean::averageValue< uint32_t > fpsCounter;
// update вызываем один раз за проход и передаем 1
// как показатель того что нарисовался один кадр.
fpsCounter.update( 1 );
// Данная конструкция ограничивает вывод данных по заданному времени.
// По умолчанию это 1000 мсек (то есть одна секунда).
// Параметр можно изменить fpsCounter.msecDeltaTime = 2000 (теперь 2 секунды).
if ( fpsCounter.isReadyToPrint() ) {
// Данная строка будет выводиться 1 раз в секунду.
// getValuePerTime возвращает сумму накопленных значений (то есть количество кадров за msecDeltaTime).
// true говорит о том что мы получили значение и можно ждать следующего.
std::cout << fpsCounter.getValuePerTime( true ) << std::endl;
}
...
}
Применение highFreqCounter и averageValue вместе.
Замеряем среднее за секунду значение вызовов функции foo().
...
// Главный цикл приложения.
while ( 1 ) {
// Создаём highFreqCounter и averageValue;
// Лучше использовать int64_t.
// Для averageValue незабудьте static или создавайте за пределами цикла, т. к. он должен существовать всё время.
boolean::highFreqCounter hfc { CLOCK_MONOTONIC };
static boolean::averageValue< uint32_t > fooProfiling;
hfc.begin(); // Начинаем считать.
foo(); // Вызываем тестируемый код.
hfc.end(); // Заканчиваем считать.
// Добавляем результат в averageValue.
fooProfiling.update( hfc.nsecGetTime() );
if ( fooProfiling.isReadyToPrint() ) {
// Получаем средний результат за секунду.
std::cout << fooProfiling.getAverageValue( false ) << std::endl;
// А так можно получить общее время потраченное на все вызовы foo за секунду.
std::cout << fooProfiling.getValuePerTime( true ) << std::endl;
// Если как здесь нужно получить результат на данный момент времени два раза,
// сначала вызываем методы с параметром false,
// а последний c true и счётчик обнулит результаты и продолжит считать дальше.
}
}
...