ПрограммированиеФорумОбщее

Обёртка над QPC (комментарии) (3 стр)

Страницы: 1 2 3
#30
18:28, 28 сен 2011

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.
Более короткие интервалы сможешь получать.

#31
1:14, 29 сен 2011

asvp
> Деление выполняется намного дольше чем умножение.
Намного дольше чем вызов QPC ?

#32
9:04, 29 сен 2011

Blew_zc
> Намного дольше чем вызов QPC ?
Нет. Добавляется еще и вызов QueryPerformanceFrequency.

#33
11:45, 29 сен 2011

Sergio
> return static_cast<float>(static_cast<double>(COUNTER) / static_cast<double>(FREQ))
Господи ты боже мой, как же это убого выглядит. Чтобы поделить два числа, надо набить 80+ символов. Код превращается в мусор. 95% шелухи, 5% алгоритма. В иных ситуациях 80 символов достаточно, чтобы реализовать qsort. Теперь понятно, для чего вам широкоформатные мониторы :)

Шутка, если что.

#34
12:28, 29 сен 2011

entryway
Зато наглядно.

#35
14:40, 29 сен 2011

Что нужно сделать, чтобы увидеть как QPC тормозит? :)))
Там что код из одного QPC состоять должен?
В игре разницы вообще не будет по скорости какой таймер юзать и умножать или делить.

NULL_PTR всё правильно говорит.

#36
21:28, 29 сен 2011

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 тактов
Разница видна сразу.

#37
23:35, 29 сен 2011

asvp
> А кто говорить, что он тормозит?

Стандартный аргумент, чем плох QPC. Типа жутко медленный.

> Разница видна сразу.

Для приложения, которое состоит из таймера и делений, а ты вот возьми "Крайзис", и сделай два варианта таймера с делением и без, как думаешь, насколько будет разница в фпс?
Я вот думаю ничего не изменится вообще.

З.Ы. Я тоже умножения больше люблю.

#38
17:38, 30 сен 2011

Народ, а скажите, зачем каждый раз вызывать QueryPerformanceFrequency?
В мсдн написано, что "The frequency cannot change while the system is running."

#39
18:28, 30 сен 2011

Помеха
> Народ, а скажите, зачем каждый раз вызывать QueryPerformanceFrequency?
Все от лени.

Прошло более 8 месяцев
#40
0:07, 15 июня 2012

Помеха
> Народ, а скажите, зачем каждый раз вызывать QueryPerformanceFrequency?
Копипаста с уровнем понимания "вот где-то в этих двух строчках я получаю текущее время".

#41
11:53, 15 июня 2012

eXmire
Ты бы еще немного почитал и год прошел с момента последнего комментария.

#42
12:08, 15 июня 2012

asvp
> Ты бы еще немного почитал и год прошел с момента последнего комментария.
Не. Я бы определенно забыл об этой теме через пару месяцев. Лучше так^^

#43
15:51, 15 июня 2012

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();
}

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

#44
15:59, 15 июня 2012

http://www.cplusplus.com/reference/std/chrono/high_resolution_clock/now/
И оберток никаких не надо !

Страницы: 1 2 3
ПрограммированиеФорумОбщее

Тема в архиве.