Sergio
> return static_cast<float>(static_cast<double>(COUNTER) / static_cast<double>(FREQ));
> return static_cast<double>(tv.tv_sec) + static_cast<double>(tv.tv_usec) / 1000000.0;
И опять же деление. Деление выполняется намного дольше чем умножение.
> float queryTime()
> {
> __int64 COUNTER;
> __int64 FREQ;
> QueryPerformanceCounter((LARGE_INTEGER*)&COUNTER);
> QueryPerformanceFrequency((LARGE_INTEGER*)&FREQ);
> return static_cast<float>(static_cast<double>(COUNTER) /
> static_cast<double>(FREQ));
> }
Каждый раз при получении времени получаешь частоту. Зачем она же const?
Её один раз получить, поделить, а потом только умножать.
Посмотри пост №26.
Более короткие интервалы сможешь получать.
asvp
> Деление выполняется намного дольше чем умножение.
Намного дольше чем вызов QPC ?
Blew_zc
> Намного дольше чем вызов QPC ?
Нет. Добавляется еще и вызов QueryPerformanceFrequency.
Sergio
> return static_cast<float>(static_cast<double>(COUNTER) / static_cast<double>(FREQ))
Господи ты боже мой, как же это убого выглядит. Чтобы поделить два числа, надо набить 80+ символов. Код превращается в мусор. 95% шелухи, 5% алгоритма. В иных ситуациях 80 символов достаточно, чтобы реализовать qsort. Теперь понятно, для чего вам широкоформатные мониторы :)
Шутка, если что.
entryway
Зато наглядно.
Что нужно сделать, чтобы увидеть как QPC тормозит? :)))
Там что код из одного QPC состоять должен?
В игре разницы вообще не будет по скорости какой таймер юзать и умножать или делить.
NULL_PTR всё правильно говорит.
Executor
> Что нужно сделать, чтобы увидеть как QPC тормозит? :)))
А кто говорить, что он тормозит?
> В игре разницы вообще не будет по скорости какой таймер юзать и умножать или делить.
Возможно. Но есть разница умножать или делить. Я всегда стараюсь заменять деление умножением.
Смотрим:
команда FDIV(R)(P) - выполнение до 21 тактов (для проца Core2Duo данные отсюда http://www.agner.org/optimize/)
команда FMUL(P) - выполнение 5 тактов.
Теперь аналитически рассчитаем скорость выполнения функции.
float queryTime()
{
__int64 COUNTER;
__int64 FREQ;
QueryPerformanceCounter((LARGE_INTEGER*)&COUNTER); // Допустим N тактов
QueryPerformanceFrequency((LARGE_INTEGER*)&FREQ); // Допустим M тактов
return static_cast<float>(static_cast<double>(COUNTER) / static_cast<double>(FREQ)); // Допустим K тактов + 21 такт деления
}
+учтем издержки L тактов. Имеем N+M+K+L+21 тактов.
Если же заранее вычитать частоту и вычислить обратное для дальнейшего умножения, то функция сократиться до:
float queryTime()
{
__int64 COUNTER;
QueryPerformanceCounter((LARGE_INTEGER*)&COUNTER); // Допустим N тактов
return static_cast<float>(static_cast<double>(COUNTER) * One_Div_FREQ)); // Допустим K тактов + 5 такт умножения
}
+учтем издержки L тактов. Имеем N+K+L+5 тактов. Что на M+16 тактов меньше.
Теперь условно считаем численно. Будем считать, условно, что каждая операция выполняется 10 тактов. И функция вызывается 1000 раз в сек (для получения времени с точностью в 1 мсек. Хотя мне и требовалось точность и 10 мксек.) Считаем:
1 функция: (10+10+10+10+21)*1000 = 61000 тактов
2 функция: (10+10+10+5)*1000 = 35000 тактов
Разница видна сразу.
asvp
> А кто говорить, что он тормозит?
Стандартный аргумент, чем плох QPC. Типа жутко медленный.
> Разница видна сразу.
Для приложения, которое состоит из таймера и делений, а ты вот возьми "Крайзис", и сделай два варианта таймера с делением и без, как думаешь, насколько будет разница в фпс?
Я вот думаю ничего не изменится вообще.
З.Ы. Я тоже умножения больше люблю.
Народ, а скажите, зачем каждый раз вызывать QueryPerformanceFrequency?
В мсдн написано, что "The frequency cannot change while the system is running."
Помеха
> Народ, а скажите, зачем каждый раз вызывать QueryPerformanceFrequency?
Все от лени.
Помеха
> Народ, а скажите, зачем каждый раз вызывать QueryPerformanceFrequency?
Копипаста с уровнем понимания "вот где-то в этих двух строчках я получаю текущее время".
eXmire
Ты бы еще немного почитал и год прошел с момента последнего комментария.
asvp
> Ты бы еще немного почитал и год прошел с момента последнего комментария.
Не. Я бы определенно забыл об этой теме через пару месяцев. Лучше так^^
Executor
> Что нужно сделать, чтобы увидеть как QPC тормозит? :)))
float times[2]; times[0] = times[1] = timer.getTime(); float val = 0; for( int i = 0; i < 1000000; i++) { val = someFunc0( val); times[0] += timer.getElapsedTime( ); val = someFunc1( cal); times[1] += timer.getElapsedTime( ); }
ситуации, когда требуется замерить время работы двух лёгких функций которые выполняются очень много раз и результат работы одной зависит от результата работы другой, бывают сплошь и рядом.
http://www.cplusplus.com/reference/std/chrono/high_resolution_clock/now/
И оберток никаких не надо !
Тема в архиве.