2013-05-18 1 views
-5

У меня есть следующий код, используя г ++ работает 3 секунды, под Microsoft компилятор работает в течение 30 секунд, и я не понимаю ...Почему код, скомпилированный в g ++, значительно быстрее, чем в компиляторе Microsoft?

struct constraint{ 
    int bitline; 
    int result; 
}; 

// this vector is filled with about 1 milion items 
vector<constraint> constraints; 

for (int a = 0; a < constraints.size(); ++a) 
{ 
    if (a% 100 == 0) cout << a << " "<<endl; 
    for (int b = a; b < constraints.size(); ++b) 
    { 
     int anded = constraints[a].bitline & constraints[b].bitline; 
     int ored = constraints[a].bitline | constraints[b].bitline; 

     // a subset of b 
     if (anded == constraints[a].bitline && constraints[a].result >= constraints[b].result) 
     { 
      // delete a 
      constraints[a].bitline = 0; 
     } 
     if (anded == constraints[b].bitline && constraints[b].result >= constraints[a].result) 
     { 
      constraints[b].bitline = 0; 
     } 

    } 
} 

EDIT: Я не использую оптимализацию флаги, жгуты. Запуск на windows xp 32 бит ... Пробовал без «отладки cout line» - никаких существенных изменений.

+1

GCC, вероятно, не всегда в 10 раз быстрее, чем MSVC. –

+0

Можете ли вы опубликовать полный код? –

+0

Разница может заключаться в том, что используемая оптимизация или cout может быть медленной в msvc по какой-либо причине. Можете ли вы отправить вам командные строки, а также повторить попытку без строки «cout << ...»? –

ответ

6

No.

Во-первых, в то время как MSVC++ имеет свои недостатки, производительность его генерируемого кода обычно не считается плохим.

Во-вторых, используйте тест «are compiler writers braindead». Насколько невероятно глупыми были инженеры Microsoft, чтобы составить компилятор, который составляет десять раз так же медленно, как и у конкурента, и не работает, чтобы улучшить его? 10% или даже 50% могут быть объяснены «компилятором Microsoft просто генерирует дерьмовый код», но 1000%? Возможно нет. Поэтому вы должны искать в другом месте объяснения. :)

А объяснение простое:

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

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

При проведении бенчмаркинга правило 1 является всегда включает оптимизацию.

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

Самый большой преступник (но не единственный) в вашем коде вероятно что MSVC в отладочной версии, operator[] на вектор содержит дополнительные проверки диапазона. Но, несмотря на это, правильный ответ не «о, я просто перестану использовать std::vector», но «о, может быть, я должен включить оптимизацию» в тех случаях, когда мне очень нужна скорость.

0

Нет, это не тот случай. Одним из недостатков GCC является то, что при компиляции без оптимизаций он не выполняет почти такую ​​же проверку отладки, как компилятор Microsoft.