Как заставить часть незавершенного кода работать даже при максимальной оптимизации? - PullRequest
1 голос
/ 15 марта 2011

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

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

Как заставить компилятор запускать этот раздел кода с максимальной оптимизацией, даже если результат не используется (я хочу, чтобы компьютер просто дал мне представление о том, как быстро работает раздел).

Я использую Visual C ++ 2008.

Ответы [ 4 ]

3 голосов
/ 15 марта 2011

Вы можете использовать SecureZeroMemory(), чтобы перезаписать результат после получения его от функции. Вам даже не нужно перезаписывать весь результат, достаточно одного элемента массива, возможно, вы даже можете передать ноль как «число байтов», чтобы функция ничего не делала.

Это подойдет для Windows - SecureZeroMemory() не предназначен для оптимизации компилятором. Использовать его довольно просто и довольно быстро.

2 голосов
/ 15 марта 2011

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

Если вы обнаружите, что ваша пустая вторая функция также оптимизируется, просто вставьте ее в общую библиотеку (DLL), и компилятору будет невозможно узнать, как она используется.

То, как вы распределяете результат, также может изменить это. Если вы передадите исходной функции указатель, вы можете просто передать ей указатель кучи. Поскольку этот указатель может использоваться где-то еще, весьма маловероятно, что компилятор сможет оптимизировать код, поскольку он не знает, будут ли использованы результаты.


Вы также можете законно использовать данные. Имеет смысл проверить результаты в другой функции. Если вы выполняете тестирование производительности, просто поместите эту часть проверки за пределы временной секции. Обычно я делаю такие тесты производительности (убедитесь, что результат проверен / использован).

2 голосов
/ 15 марта 2011

Это то, для чего предназначен тест. Напишите тестовый пример в отдельном двоичном файле (даже просто в методе main ()), который устанавливает одноразовую локальную переменную для результата функции. Время с использованием предпочтительного метода (например, путем захвата времени (NULL) непосредственно до и после назначения и печати разницы во времени). Вы должны иметь приличное представление о продолжительности этого.

РЕДАКТИРОВАТЬ : время (NULL) с точностью до целой секунды = плохо и зло. Используйте clock (), как показано здесь , для наиболее точной точности в стандартной библиотеке C / C ++.

0 голосов
/ 15 марта 2011

Если вы используете Visual Studio, код здесь будет работать, но я не знаю ни о каких других решениях для gcc

#pragma optimize( "", off )
.
.
.
#pragma optimize( "", on ) 
...