forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   booleanstd highFreqCounter и averageValue (http://forum.boolean.name/showthread.php?t=19659)

Samodelkin 24.01.2015 02:46

booleanstd highFreqCounter и averageValue
 
Вложений: 2
Иногда я встречаюсь с ситуациями когда нужно написать тот или иной код, который часто попадается в среднестатистических проектах.
Однако обычно он считается слишком маленьким чтобы создавать отдельную библиотеку для него и сохранять на будущее.
Сейчас я всё-таки решил что будет полезно по ходу дела выделять такие коды в отдельные файлы и выкладывать их сюда, может кому-нибудь они тоже часто бывают нужны.

Было бы неплохо поместить такие коды в отдельный раздел.
В одну тему складывать не очень удобно, т. к. они могут обновляться и по ним могут задаваться вопросы -- будет путаница.
В название темы написал booleanstd чтобы потом такие темы легко искались через поиск.

Код я поместил в namespace boolean.

Высокоточный счётчик времени (наносекунды).
Вложение 21427 v. 0.5.1.a, Linux, C++14

Алгоритм подсчёта общей суммы и среднего значения.
Вложение 21428 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 и счётчик обнулит результаты и продолжит считать дальше.
    }
}
...



Часовой пояс GMT +4, время: 04:51.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot