Символы поотрезали при помощи strip? Они по умолчанию в GCC всегда пишутся даже для релизов, и нехило бинарник увеличивают. Например я когда сам GCC пересобирал, после отрезания символов бинарник в два раза меньше стал. Кстати почему у MSVC /O2 - /Ox лучше не делает?
cupuyc, посмотрел CB проект, зачем одновременно включены O, O1, O2, O3, Os? Наверное, стоит почитать документацию. А у GCC есть ffast-math
cupuyc Спс, давно хотелось, чтобы кто-нибудь сравнил. qqwe Это что такое? И, кстати, читал, что Микрософт собирает всё с опцией минимизации размера, а не увеличения скорости. Кроме того там все приблуды вроде BSC. А в пдб командная строка, с помощью которой делался объектник не сохраняется?
cupuyc Я в командлайн параметрах не шарю. У студии выставлены Maximize speed, Favor fast code, Enable link-time code generation, SSE2 ?
rat4, честно говоря, я в gcc вообще не разбираюсь. Если Вам не сложно - укажите какие флаги лучше поставить для оптимизации по скорости. _DEN_, да, все флажки выставил. Сейчас следующие результаты: gcc 7500 vc 10700
cupuyc CPU Intel Core2 E8400 @ 3 GHz VC++ 9.0(2008) - 6060 ms (/O2 /GL) GCC 4.5.1 (MinGW) - 3646 ms (/O3 -fomit-frame-pointer) Однако... Нужно будет поисследовать на досуге. --- Update: VC++ 10.0(2010) - 3050 ms (/O2 /GL) Реванш
основные оптимизации: -O2 -fomit-frame-pointer экстримальная (возможна некорректная работа ) оптимизация: -O3 -fomit-frame-pointer -ffast-math
Частая и меняющая все ошибка. Это не сравнение компиляторов, это сравнение связки компилятора и stl, код которого, естественно, разный. Для msvc могу посоветовать ключи /O2 /GS- /GR- /GF /GL /fp:fast /DNDEBUG Так же в обоих компиляторах можно задействовать PGO. Узкое место наверняка в STL, хотя код смотрел по диагонали - может это и не так.
Посмотрел. semen прав - всё дело в STL, а именно в checked iterators (которые в VC++ 9.0 включены даже в Release-конфигурации, в отличие от GCC и VC++ 10.0). Отключение checked-итераторов в VC9 (/D_SECURE_SCL=0) ставит всё на место - код становится слегка быстрее GCC-шного. VC++ 10 обошёл обоих за счёт автовекторизации некоторых циклов.
не было. потом поставил и проверил. Да, видать, десятая студия всё-таки генерирует лучший код. Может кто-нибудь сможет добить gcc'шную сборку? Линуксоиды говорят что там всякие хитрые опции есть. Если поплясать с бубном, то можно получить лучший код.
green Ниасилил Динамический рантайм. У меня студия не установлена, и рантайма нет. Всмысле - 10-я не установлена.
rat4 -fomit-frame-pointer входит в сет -O2. По-моему, он даже входит в сет -O1. cupuyc Плясать не надо. Надо взять мануал к используемой версии gcc и втыкать в мануал. Если много лишнего времени, то можно параллельно запустить emacs, писать код, компилировать с разными опциями оптимизации добавляя к ним -S -fverbose-asm, и разглядывать ассемблерный код на выходе. Я, к сожалению, не имею много лишнего времени последние года три. Поэтому советы мои могли устареть. Но я бы взял -O3 и добавил бы к нему -ftracer. Можно -ffast-math, если деления на ноль и извлечения корней из отрицательных чисел в программе не случаются или не обрабатываются. Можно ещё повтыкать в -funroll-loops и ещё один -funroll-loops (другая опция, не помню как точно называется, но тоже разворачивающая циклы). Вроде вторая не врубалась ни одним из сетов -O, да и ещё вокруг обоих были целые облака сопутствующих опций, которые могли сделать разворачивание циклов эффективнее.