Компиляция с /O2 по сравнению с /Ox, которая быстрее (как правило)?

Этот вопрос и MSDN, кажется, подразумевает, что /O2 будет быстрее, но если вы посмотрите на собственный < класс href="http://safeint.codeplex.com/" rel="nofollow noreferrer">SafeInt, вы заметите, что он говорит:

1) Скомпилируйте оптимизированный код - /Ox лучше всего, /O2 также работает хорошо. Интересно, что /O1 (оптимизировать по размеру) тоже не работает.

Если разница действительно всего лишь /GF /Gy, как сказано в вопросе выше, то /GF не имеет значения (объединение строк), а /Gy (исключение указателей кадров) не может на самом деле навредить вам, насколько я понимаю.

Есть что-то, что мне не хватает? /Ox вообще быстрее? Почему или почему нет?


person user541686    schedule 11.08.2012    source источник
comment
Похоже, человека, написавшего этот комментарий, тоже смутило название соответствующих опций. Они предположили, как и я, что /Ox был более высоким уровнем оптимизации, потому что в документации это называется полной оптимизацией.   -  person Cody Gray    schedule 11.08.2012
comment
@CodyGray: У меня складывается впечатление, что они действительно пробовали это, хотя... это не звучало как предположение.   -  person user541686    schedule 11.08.2012
comment
Они, вероятно, сделали. И они не могли найти никакой разницы между /Ox и /O2, они просто решили поощрять использование /Ox, потому что оно звучало лучше. Они сказали, что /O2 тоже работает хорошо.   -  person Cody Gray    schedule 11.08.2012
comment
@CodyGray: Я не понимаю, откуда у вас такое впечатление, поскольку они ясно сказали, что /Ox лучше... но если вы действительно думаете, что они их не сравнивали, то ладно.   -  person user541686    schedule 11.08.2012
comment
Всегда профиль и на нескольких процессорах. x86 - это сложное семейство, и не всегда ясно, какие флаги компилятора дадут наилучшие результаты - это зависит от сочетания вашего исходного кода и целевого процессора.   -  person snemarch    schedule 12.08.2012


Ответы (1)


/Gy не является пропуском указателя кадра, это /Oy, который включен как минимум в /Ox, /O1, /O2.

/Gy - это генерация COMDAT (связывание на уровне функций), которая имеет тенденцию уменьшать размер рабочего набора, но не должна сильно влиять на качество кода. А в шаблонном и встроенном коде, таком как SafeInt, вероятно, вообще нет заметной разницы.

На странице MSDN, на которую вы ссылаетесь, также говорится об использовании /O2 вместо /Ox, поэтому я не думаю, что идея «/Ox быстрее в целом» имеет какое-либо значение.

person Ben Voigt    schedule 11.08.2012
comment
Упс, мое плохое поколение COMDAT. Но нет, это не моя идея — так говорят комментарии к коду. Загрузите SafeInt3.hpp и посмотрите сами; они ясно говорят, что /Ox там быстрее. Я не понимаю, почему, или если это общее или нет (опять же, если нет, то почему). - person user541686; 11.08.2012
comment
@Mehrdad: Извините. Я приписывал вам только обобщение, а не претензию в отношении этого конкретного файла. В любом случае, если вы еще раз прочитаете формулировку комментария, она полностью согласуется с тем, что /Ox и /O2 равны и лучше любого другого набора параметров. Это не та формулировка, которую я бы выбрал, но в этом случае правильно говорить /Ox is best. Просто так получилось, что /O2 тоже лучше. - person Ben Voigt; 12.08.2012