Небольшой тест компиляторов под Win

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 4 Nov 2010.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    INTRO
    Часто идут споры связанные с тем какой Си компилятор круче или быстрее или качественнее.
    Конечно о крутости не мне судить, а лишь тем кто использует компиляторы. Насчет быстроты компиляции - ну нас это как-то сейчас не касается, мы же не собираемся ядра компилить) А вот скоростные качества создаваемого кода мы сможем проверить.

    Условия теста
    A) На тест берутся 3 компилятора:
    1) Intel C++ Compiler Pro 11.1.054
    2) Microsoft C/C++ Compiler 15.00.21022.08 (из VS 2008)
    3) gcc 4.5.0 из набора MinGW

    Б) Тестирование будет производиться
    1) Win XP SP3 Eng x32 - комп
    2) Win XP SP3 Rus x32 - ноут

    В) Чтобы не было разговоров о том что из-за Intel проца была производительность, то тест делается на следующих процах:
    1) Intel E5200 x2 (2.5 Ггц) + 2 Гб Озу - обычный комп
    2) AMD Athlon x2 (2.0 Ггц) + 3 Гб Озу - ноут

    Г) Алгоритм тестирования - 1 миллион итераций вычисления MD5 хеша от предыдущего хеша начиная со строки 123456789012345678901234567890AB
    И замер времени этой операции.
    Code:
    #include <windows.h>
    
    
    #include "md5.h"
    
    int main(int argc, char* argv[])
    {
    	char buf[256];
    	int x;
    	DWORD StartTime;
    	DWORD StopTime;
    
    	lstrcpyA(buf, "123456789012345678901234567890AB");
    
    	StartTime = GetTickCount();
    
    	for (x = 0; x < 1000000; x++)
    	{
    		GetMD5(buf, 32, buf);
    	}
    
    	StopTime = GetTickCount();
    
    	wsprintfA(buf, "Time: %u\n", StopTime - StartTime);
    	MessageBoxA(0, buf, "test", 0);
    	ExitProcess(0);
    
    	return 0;
    }
    
    
    
    Д) Варианты компиляции: Каждый тест будет проводиться на следующих вариантах компиляции:
    1) Без оптимизации
    2) Оптимизация по скорости

    По возможности в настройках будет задано создание как можно более простого файла, т.е. без проверок на переполнение буфера итд итп.

    Результатом тестирования будет время выполнения кода, чем меньше тем лучше.

    И главное вся работа на WinApi чтобы не юзать CRT и прочую хрень которая может вносить разность в тестирование.

    Microsoft C/C++ Compiler 15.00.21022.08 (из VS 2008)
    1) Комп: Без оптимизации - 3688мс
    2) Комп: С оптимизацией - 2828 мс
    3) Ноут: Без оптимизации - 5657 мс
    2) Ноут: С оптимизацией - 4422 мс

    Intel C++ Compiler Pro 11.1.054
    1) Комп: Без оптимизации - 3766 мс
    2) Комп: С оптимизацией - 2813 мс
    3) Ноут: Без оптимизации - 5750 мс
    4) Ноут: С оптимизацией - 4375 мс


    gcc 4.5.0 из набора MinGW
    1) Комп: Без оптимизации - 3297 мс
    2) Комп: С оптимизацией - 2906 мс
    3) Ноут: Без оптимизации - 5234 мс
    4) Ноут: С оптимизацией - 4407 мс

    О результатах можите судить сами ))

    P.S. чуть позже может быть проведу еще парочку добавочных тестирований
     
  2. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    И что? Что показывает это исследование? Доли секунды в обычных приложениях ничего не играют. Большие вычисления всё равно будут на CUDA/OpenCL, основная доля приложений — веб, тут уже оптимизированность браузера/платформы веб-приложения. На серверах уже совсем другая оптимизация(как минимум, не win, icc — может быть).
     
  3. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    2slesh
    может лучше было бы юзать
    kernel32.dll!GetThreadTimes ? она учитывает что поток мог вытеснятся
    и не считает это время
    а вот GetTickCount не понятно может просто
    не повезло потоку и его вытеснили больше раз
     
  4. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    хотя с kernel32.dll!GetThreadTimes тоже есть одна тонкость смысл в том
    что если поток вытесняется или добровольно отказывается
    от выделенного ему кванта то она вернет неверный результат
    вот подробное описание
    http://blog.kalmbachnet.de/?postid=28
     
  5. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    conclusion
    GetTickCount считает время когда поток не подключен к процессору
    это 100% неверно
    GetThreadTimes считает только когда поток подключен к процессору
    даже можно сказать "слишком старается" так как
    если поток отдаст свой квант не доработав его она не засчитает это
    интересно а можно точно измерить ?
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну так измерения шли примерно на одинаково загруженных системах.
    На ноуте для теста вообще голая винда + тока прога эта. К томуже каждый тест был выполнен по 3-4 раза и было взято среднее время.

    2 scrat ну знаешь, MD5 это довольно приметивная задача, а серверный софт обрабатывает чуть другие данные. И часто очень пишется на gcc. А под винду на MSVC.
    Вообще судя из показаний - смысла нет юзать крутой интеловский компилятор (который сильно распиарен) для задач не требующих распараллеливание.

    CUDA/OpenCL не пойдет для многих серверных приложений где нужны вычисления чуть другова характера, в частности связанные не с мат вычислениями а больше с рабой с памятью.
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    [​IMG]
     
    _________________________
    #7 Gar|k, 5 Nov 2010
    Last edited: 5 Nov 2010
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Завтра если будет время, то сделаю более реалистичное тестирование которое будет затрагивать отчасти и работу с памятью. Ну и более адекватнее расчет времени сделаю, в частности более сложные вычисления будут.
     
    1 person likes this.
  9. Int32

    Int32 New Member

    Joined:
    24 Aug 2010
    Messages:
    19
    Likes Received:
    1
    Reputations:
    1
    а гдеж borland c++ compiler ?
     
  10. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Int32 увы его не использую вообще, по этому на компе его нет. Конечно могу поискать мож найду где нить поблизости, тогда будет обзор и с ним