2012-04-27 8 views
-1

Когда я пишу процедуру для проверки производительности двух продуктов, какие флаги оптимизации следует использовать? -O0, -O2 или -g?Тест производительности двух продуктов, какие флаги должны использовать (с gcc)? -O0, -O2 или -g?

+0

Подумайте об этом. Вы фигурируете ***, может быть, *** людям нужно будет знать, какой компилятор или что вы говорите? ;-) Этот стиль флага является общим для нескольких. –

+0

@ T.J.Crowder Люди любят выпущенное программное обеспечение, поэтому я выбираю -O2. Благодарю. –

+1

@ user: Вам, кажется, не хватает точки, но по крайней мере вы добавили «с gcc» в заголовок вопроса. (Подсказка: * Это теги для *) –

ответ

1

Вы должны проверить эффективность своего кода, используя каждый из параметров. В идеале, чем больше число -O0, -O1, -O2, -O3, тем лучше производительность, так как есть более/более оптимизация, но это не всегда так.

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

Существует определенно не один параметр оптимизации, который обеспечивает лучшую производительность для любого кода, который может быть скомпилирован этим компилятором. Вы должны проверить настройки и компилятор на определенной системе, чтобы убедиться, что для этой системы код действительно работает быстрее. Как вы тестируете, что производительность заполнена множеством ловушек и другими проблемами при создании ошибок, которые вы легко можете понять неправильно. Поэтому вы должны быть осторожны в том, как вы тестируете свою работу.

Для gcc обычно говорят, что -O3 рискованно использовать, а -O2 - лучшая производительность/безопасность. И по большей части это тот случай, когда -O2 используется достаточно, чтобы удалить много ошибок. -O2 не всегда производит самый быстрый код, но обычно он генерирует более быстрый код, равный -O0 и -O1. Использование отладчиков может победить оптимизацию или удалить все вместе, поэтому никогда не проверяйте производительность с помощью отладчика на основе сборки или с помощью отладчика. Тестирование в системе, когда пользователь будет использовать систему, если пользователь использует отладчик, когда они запускают вашу программу, тогда проверьте этот способ, иначе нет.

0

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

Если вы хотите включить оптимизацию скорости, используйте флаги -O1 или -O2. См. man gcc(1) для получения дополнительной информации.

Если вы хотите измерить эффективность вашего кода, используйте profiler, например valgrind или gprof.

0

На самом деле, если вам интересно, вы должны обязательно использовать -O3. Зачем отдавать потенциальную оптимизацию?

И да, существует небольшая, но измеримая разница между -O2 и -O3.

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

+0

'O3' не обязательно лучше, чем' O2' для gcc, насколько я понимаю. O3 делает агрессивную вставку, которая может повредить местность и снизить производительность. Следовательно, всегда хорошая идея проверить оба и посмотреть, что дает лучшую производительность. – Voo

+0

@Voo Как я уже сказал, есть тесты. Хотя '-O3' может в патологических случаях быть медленнее, чем' -O2', он обычно быстрее или, по крайней мере, так же быстро.Обычно инкрустация не должна снижать производительность, так как оптимизатор не строит «глупо», он по-прежнему использует эвристику, чтобы определить, будет ли скорость выполнения выиграть от вложения. –

Смежные вопросы