Обсуждаем компиляторы

Тема в разделе "Машинное отделение", создана пользователем WinPooh, 29 июн 2007.

  1. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    А давайте обсудим компиляторы - кто каким пользуется, с какими настройками... Чур, без языковых войн а-ля "Паскаль против Си" :)
     
  2. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Публичная версия Греки собрана с помощью gcc/MinGW 3.4.5 под Windows, и с помощью того же gcc (но уже 4-й версии) под Линуксом и Маком. В качестве редактора использую на 90% vim и на 10% - встроенный редактор FAR-а.

    Новую версию (скорее всего, она будет в стандарте ANSI C - для большей совместимости) планирую собирать на двух компиляторах, gcc и MSVC 6.0. Пробовал Visual C++ 2005 - не понравилось. Выигрыша в производительности не заметил, а среда разработки не пришлась по вкусу.

    Интеловский компилятор давно замышляю попробовать, но как-то качать 150 метров ради триальной версии с месяцем работы - пресловутое земноводное не позволяет...
     
  3. krey
    Оффлайн

    krey Михаил Кройтор Команда форума Команда форума

    Репутация:
    1
    кстати, я сравнивал результаты оптимизации vc++6.0 и vc++2005 - никакой разницы. такое ощущение, что новая версия просто расширена для поддержки .NET, ну, возможно, еще подправлены какие-то штуки, под стандарт компилятор подогнали. сам я пользуюсь gcc (нравится), VC++2005 (надо). Но оптимизация С++ у GCC никакая (очень плохо работает с оптимизацией потоков), в отличие от С. так что, если хочется получить быструю и маленькую програмку через GCC - пишу в стиле С++ используя сишные функции... когда-то использовал интеловский компилятор (7-ка) - неплохой. а кто что может сказать о mars?
     
  4. варяг
    Оффлайн

    варяг Учаcтник

    Репутация:
    0
    Не знаю, как сейчас, но полгода назад я в инете находил кряки для Intel C++, причем для разных версий. Правда скачать ни кряки, ни триальную версию, я так и не удосужился :)
     
  5. krey
    Оффлайн

    krey Михаил Кройтор Команда форума Команда форума

    Репутация:
    1
    кстати, насчет компиляторов - можно почитать о бесплатных
     
  6. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Перекомпилил свой генератор ходов под винду (VC++ 6.0). Время уменьшилось до 39 секунд (против 63 секунд когда компилил BCPP 3.0 для DOS). Думаю перевести на паскаль (компилить буду Delphi 6.0), если не обломаюсь, и сравнить скоростя.
     
  7. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Зочем же сразу в делфи переводить, попробуй его "старшего" брата билдер 6, ИМХО он всегда быстрее делфи, но все равно они оба медленее студийных компилеров.
     
  8. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Так антиресно паскаль посмотреть, а шо толку от билдера? Или ты намекаешь что билдер лучше VС++ ?
     
  9. Chemer
    Оффлайн

    Chemer Максим

    Репутация:
    0
    Ты не правильно прочитал мой пост. Я наоборот пишу, что он и делфи медленее VC++. А уж тем более интеловского.
     
  10. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Билдер не быстрее чем Делфи, VC сравним по быстродействию с Делфи. А вот Интеловский конечно круче. Но разница в быстродействии не так уж и велика.
     
  11. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    NS, а какой у тебя perft на Дельфи?
     
  12. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    Я уже даже и не помню куда исходники старой Анечки засунул, Так что насчет Perft ничего сказать не могу :)
    Но я в ней не гнался за скоростью.
     
  13. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    нашел у себя Intel 9.1 32bit - только что-то он не интегрировался в VS... непойму пока.
     
  14. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    А у тебя VS какая? У меня в VS2005 интегрировался без проблм.
     
  15. Shark
    Оффлайн

    Shark Учаcтник

    Репутация:
    0
    Вот мои 5 копеек.

    Регулярно пишу на С/С++, в качестве хобби часто просматриваю сгенерированный ассемблерный код. Смотрю соответствует ли работа оптимизатора моим ожиданиям.

    За последние 10лет по моему мнению ситуация примерно такая.

    Intel - Всегда идет чуть впереди всех.

    Лет 10 назад Watcom был в лидерах
    Лет 5-6 назад мне очень нравился код кенерируемый Borland 4 и 5 версии
    На даный момент VS 2005 лучший следом за Интел, код - очень хороший.

    GCC всегда имел компромис с совместимостью в ущерб производительности.
    Он замыкает список лучших компиляторов.

    Мнение мое основано на анлизе сгенерированого кода.

    Ну и рекомендации по опциям MSVC:
    CallingConvention=__fastcall (/Gr)
    Optimization=Maximize Speed (/O2)
    InlineFunctionExpansion=Any Suitable (/Ob2)
    EnableIntrinsicFunctions=Yes (/Oi)
    FavorSizeOrSpeed=Favor Fast Code (/Ot)
    OmitFramePointers=Yes (/Oy)
    BufferSecurityCheck="false"
     
  16. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    NS vs2005 express, в 2003 вроде без проблем вставал.
     
  17. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    В Экспресс вроде не встает. Я его установил и тут-же снес. Он порезан просто до безобразия. Таким продуктом пользоваться нельзя :)
     
  18. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    NS тогда 2003 установлю :) 2005 полного у меня нет.
     
  19. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    в 2003 все ок встало. оптимизирует неплохо! на том же коде в тесте выйграл 1.5 сек :)
     
  20. krey
    Оффлайн

    krey Михаил Кройтор Команда форума Команда форума

    Репутация:
    1
  21. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    известное сравнение. но старенькое уже.
     
  22. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Может кто-нибудь знает как сделать, что в VS можно было компилировать такой код:
    Код:
      for(int i = 0; i < 64; i++)
        zobEp[i] = Key(genrand_int64());
      
      for(int i = 0; i < 16; i++)
        zobCastle[i] = genrand_int64();
    Он считает, что i объявляется повторно.
     
  23. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    А что мешает i отдельно объявлять?
     
  24. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    По стандартам С99 и С++ как раз можно. Область действия объявления - до конца выражения for.
    См.
    C99 Standard, 6.8.5.3
    С++ Standard, 6.5.3
     
  25. MikhailK
    Оффлайн

    MikhailK Mikhail Kalenkov

    Репутация:
    0
    Portability Hints: Microsoft Visual C++ 6.0 SP4
    Scopes of definitions in for-loops

    The scope of variable definitions in for loops should be local to the loop's body, but it is instead local to the enclosing block.

    Workaround: Enclose the offending for loops in another pair of curly braces.

    Another possible workaround (brought to my attention by Vesa Karvonen) is this:
    Note that platform-specific inline functions in included headers might depend on the old-style for scoping.
    http://www.boost.org/more/microsoft_vcpp.html

    http://support.microsoft.com/kb/167748/
     
  26. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
  27. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Я в таких случаях для пущей совместимости объявляю переменную вне оператора цикла.
     
  28. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Так это неустранимый баг VC++?
     
  29. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    А что это так критично? Зачем тебе это надо? Чем плохо отдельно объявлять переменную?
     
  30. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Иногда приходится компилировать чужие исходники.
    Например, как побороть такое горе:

    const Bitboard FileABB = 0x0101010101010101ULL;

    VC++ не знает таких суфиксов.
     
  31. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    У меня для этого определен макрос:

    Код:
    #ifdef _MSC_VER
    #define LL(x) x##L
    #else
    #define LL(x) x##LL
    #endif
     
  32. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Так константы уже в таком виде:
    0x0101010101010101ULL;

    И достаточно ли будет одного L?
     
  33. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    А константы я пишу так:
    Код:
    const U64 x = LL(0xfefefefefefefefe);
     
  34. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Так все уже написано до нас. Нам только скомпилить надо.
     
  35. MikhailK
    Оффлайн

    MikhailK Mikhail Kalenkov

    Репутация:
    0
    http://support.microsoft.com/kb/167748/

    RESOLUTION
    Compile with /Za, Disable Language Extensions. To select this option in Developer Studio, select Project, Settings, and then click the C/C++ Tab. Change the Category to Customize and select Disable Language Extensions.

    If you cannot use the /Za option, you can work around the problem by #defining the "for" keyword as follows:

    Что непонятно?