Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 23.01.2015, 23:46   #1
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 977
Написано 388 полезных сообщений
(для 630 пользователей)
booleanstd highFreqCounter и averageValue

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

Было бы неплохо поместить такие коды в отдельный раздел.
В одну тему складывать не очень удобно, т. к. они могут обновляться и по ним могут задаваться вопросы -- будет путаница.
В название темы написал 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 и счётчик обнулит результаты и продолжит считать дальше.
    }
}
...
__________________
Config1: Windows 10 x64 / Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1920x1080; Intel Core i7 930 @ 2.80GHz; DDR3 9GB Triple; AMD Radeon R9 290 4GB; SSD Ignition 2 120GB; HDD Seagate 1TB.
Config2: Linux Ubuntu Xenial x64 (Xfce-4); Default Resolution 1366x768; Intel Pentium Dual-Core T4400 @ 2.20GHz; DDR2 2GB; NVIDIA GeForce G105M; HDD WD 250GB.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (24.01.2015)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 21:03.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com