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. чуть позже может быть проведу еще парочку добавочных тестирований
И что? Что показывает это исследование? Доли секунды в обычных приложениях ничего не играют. Большие вычисления всё равно будут на CUDA/OpenCL, основная доля приложений — веб, тут уже оптимизированность браузера/платформы веб-приложения. На серверах уже совсем другая оптимизация(как минимум, не win, icc — может быть).
2slesh может лучше было бы юзать kernel32.dll!GetThreadTimes ? она учитывает что поток мог вытеснятся и не считает это время а вот GetTickCount не понятно может просто не повезло потоку и его вытеснили больше раз
хотя с kernel32.dll!GetThreadTimes тоже есть одна тонкость смысл в том что если поток вытесняется или добровольно отказывается от выделенного ему кванта то она вернет неверный результат вот подробное описание http://blog.kalmbachnet.de/?postid=28
conclusion GetTickCount считает время когда поток не подключен к процессору это 100% неверно GetThreadTimes считает только когда поток подключен к процессору даже можно сказать "слишком старается" так как если поток отдаст свой квант не доработав его она не засчитает это интересно а можно точно измерить ?
Ну так измерения шли примерно на одинаково загруженных системах. На ноуте для теста вообще голая винда + тока прога эта. К томуже каждый тест был выполнен по 3-4 раза и было взято среднее время. 2 scrat ну знаешь, MD5 это довольно приметивная задача, а серверный софт обрабатывает чуть другие данные. И часто очень пишется на gcc. А под винду на MSVC. Вообще судя из показаний - смысла нет юзать крутой интеловский компилятор (который сильно распиарен) для задач не требующих распараллеливание. CUDA/OpenCL не пойдет для многих серверных приложений где нужны вычисления чуть другова характера, в частности связанные не с мат вычислениями а больше с рабой с памятью.
Завтра если будет время, то сделаю более реалистичное тестирование которое будет затрагивать отчасти и работу с памятью. Ну и более адекватнее расчет времени сделаю, в частности более сложные вычисления будут.
2 Int32 увы его не использую вообще, по этому на компе его нет. Конечно могу поискать мож найду где нить поблизости, тогда будет обзор и с ним