Как стать автором
Обновить

Тест Си компиляторов под Windows

Время на прочтение4 мин
Количество просмотров8.2K
После многочисленных споров на тему «Какой компилятор лучше генерирует код», появилась идея провести самому испытания. Основной целью испытания была проверка скорости работы программы с оптимизацией по скорости. Результат тестирования: среднее арифметическое время выполнения тестовой функции в миллисекундах (1/1000 сек). т.е. чем меньше тем лучше.

В тестировании участвовали:
  • Intel C++ Compiler Pro 11.1.054;
  • GCC 4.5.0 (MinGW);
  • MS C/C++ Compiler 15.00.21022.08 (VS 2008);
  • CodeGear C++ Builder 11.0 (C++Builder 2007);
  • Tiny C Compiler 0.9.25.
Железо для теста:
  • Компьютер: CPU Intel E5200 (2-ядерный) 2.5 Ггц + 2 Гб ОЗУ;
  • Ноутбук: CPU AMD Athlon QL-62 (2-ядерный) 2 Ггц + 3 Гб ОЗУ.
ОС для теста:

MS Windows XP SP3 Eng x32 на ноутбуке и на компьютере (с одного диска устанавливались и один и тот же SP3 ставился).

Варианты компиляции:
  1. Отключена любая оптимизация;
  2. Включена вся возможная оптимизация.
Ограничения на тестирование:
  • Исходный код тестовой программы не изменяется в зависимости от компилятора;
  • Тестовая функция не использует функции системы, т.е. только вычислительные операции, все функции связанные с вызовом системных функций вызываются до и после замера времени;
  • Не используются библиотеки распараллеливания типа OpenMP;
  • Вычисления производятся только в одном потоке;
  • Компьютер не загружен больше никакими другими программами, только запущенная Windows + Notepad + тестовая программа;
  • Для тестов не использовалась VCL, MFC, CLR, ATL;
  • Код программ компилировался именно как С код, а не С++;
  • Для Tiny C Compiler использовался только 1 вариант компиляции, потому что он не поддерживает оптимизацию на уровне кода. Из документации: Оптимизация кода ограничена вычислением константных выражений на этапе компиляции, заменой операций умножения и деления операциями сдвига где это возможно, а также некоторыми другими действиями. Оптимизация переходов не производится, так как это потребовало бы организацию промежуточного кода в более абстрактном виде.
Метод тестирования:
  1. Выделение памяти для буферов;
  2. Получение UserTime текущего потока через GetThreadTimes;
  3. Выполнение тестовой функции;
  4. Получение UserTime текущего потока через GetThreadTimes;
  5. Получение разницы во времени с точностью до миллисекунд (1/1000 сек);
  6. Повторение последних 4-х действий 10 раз;
  7. Вычисление среднего арифметического значения времени.
Алгоритм вычислительной функции:
  1. Инициализация ключевой последовательности для алгоритма шифрования RC4;
  2. Инициализация ключевой последовательности для алгоритма шифрования AES-128;
  3. Заполнение первого тестового буфера данными полученными из генератора RC4;
  4. Вычисление CRC32 для первого тестового буфера;
  5. Шифрование первого тестового буфера алгоритмом AES-128, блоками по 128 бит, с помещением результата во второй тестовый буфер;
  6. Заполнение первого тестового буфера данными полученными из генератора RC4, т.е. первоначальные данные затираются полностью;
  7. Расшифровка второго тестового буфера с помещением результата в первый тестовый буфер;
  8. Подсчет CRC32 для расшифрованного первого тестового буфера;
  9. Сравнение CRC до шифрование и после.
Параметры теста:
  • Кол-во данных для шифрования — 1600 килобайт (102400 блоков);
  • Кол-во тестовых итераций для вычисления среднего арифметического значения времени — 10.
Результаты тестирования:
Intel C++ Compiler Pro 11.1.054
  • Ноутбук без оптимизации: 6301 мс;
  • Ноутбук с оптимизацией: 971 мс;
  • Компьютер без оптимизации: 4541 мс;
  • Компьютер с оптимизацией: 867 мс.
GCC 4.5.0 (MinGW)
  • Ноутбук без оптимизации: 6568 мс;
  • Ноутбук с оптимизацией: 1691 мс;
  • Компьютер без оптимизации: 4979 мс;
  • Компьютер с оптимизацией: 1521 мс.
MS C/C++ Compiler 15.00.21022.08 (VS 2008)
  • Ноутбук без оптимизации: 5149 мс;
  • Ноутбук с оптимизацией: 1574 мс;
  • Компьютер без оптимизации: 3740 мс;
  • Компьютер с оптимизацией: 1290 мс.
CodeGear C++ Builder 11.0 (C++Builder 2007)
  • Ноутбук без оптимизации: 4982 мс;
  • Ноутбук с оптимизацией: 3854 мс;
  • Компьютер без оптимизации: 4006 мс;
  • Компьютер с оптимизацией: 3185 мс.
Tiny C Compiler 0.9.25
  • Ноутбук: 6275 мс;
  • Компьютер: 4606 мс.
Более наглядно:График времени выполнения кода:imageГрафик скорости выполнения кода относительно лидера теста (лидер теста — 100%)image

Итоги:
По результатам тестирования на оптимизацию по скорости, компиляторы занимают следующие места:
  1. Intel C++ Compiler Pro 11.1.054;
  2. MS C/C++ Compiler 15.00.21022.08 (VS 2008);
  3. GCC 4.5.0 (MinGW);
  4. CodeGear C++ Builder 11.0 (C++Builder 2007);
  5. Tiny C Compiler 0.9.25.
Как видно, ребята из Intel хорошо постарались (на 32% код работал быстрее чем у ближайшего соперника) и их код имеет отличную оптимизацию не зависимо от того что он работает на Intel или AMD процессоре.

В тоже время С++ Builder показал себя не с лучшей стороны (отставание в 2 раза), что свидетельствует о чуть другой специфики его применения.

Ну а про Tiny C Compiler 0.9.25 и речи не может быть, потому что он вообще не поддерживает оптимизацию переходов, вот и выходит, что скорость выполнения программы находится на уровне с другими компиляторами без оптимизации при компиляции.

Конечно С++ Builder оказался чуть староват потому что не нашел я у себя более свежей версии. Хотя мне кажется, там мало что изменилось в этом плане.

Заключение
По результатам тестирования нельзя судить о компиляторе, что он хорош или плох, потому что каждому своё применение, а можно лишь говорить о том, какой их них подойдет для создания программных продуктов связанных с вычислительными операциями.
Теги:
Хабы:
Всего голосов 23: ↑18 и ↓5+13
Комментарии12

Публикации

Истории

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область