Сравнение компиляторов языка С++ для трудных задач
Содержание
Введение
.
Обзор компиляторов
.1
MinGW
.2
Borland Builder
1.3
Watcom
.4
Intel C++
.5
Visual C++
2.
Обзор задач
.
Тестирование
Заключение
Список
использованных источников
Введение
Для решения вычислительных задач немаловажной
является проблема выбора инструмента. При вычислениях с использованием
бинарного кода важно, чтобы код был оптимальный по затратам вычислительных
ресурсов и ресурсов памяти. Помимо этого обнаружилась серьезная проблема
времени компиляции исходного кода. Так, в некоторых комбинаторных задачах, где
используются тысячи многократно вложенных циклов, некоторые компиляторы
отказываются компилировать. В связи с этим актуальной является проблема выбора
«правильного» компилятора. Практическая значимость нашей работы заключается в проведении
тестов, изучении компиляторов и выборе наиболее подходящего. В рамках работы мы
ограничились наиболее известными компиляторами языка С++. Для исследования мы
выбрали несколько компиляторов, такие как: MinGW, Borland Builder, Intel C++
Professional Edition, Watcom и Visual Studio.
Основные цели нашей работы:
познакомиться с компиляторами языка С/С++,
изучить возможности различных компиляторов,
провести сравнительный анализ компиляторов на
программах для трудных задач.
В соответствии с поставленными целями определили
следующие задачи:
отыскать информацию по наиболее известным
компиляторам,
написать несколько тестовых программ,
найти более сложные программы,
провести тестирование,
сделать выводы.
1. Обзор компиляторов
.1 MinGW
Информация взята с сайта [1]. MinGW, сокращенно
«минималистский GNU для Windows», является минималистической средой разработки
для родных приложений Microsoft Windows.предоставляет полный программный пакет
с открытым исходным кодом, который подходит для развития собственных приложений
MS-Windows, и которые не зависят от любых третьих сторон C-Runtime DLL (только
Microsoft C библиотеки, MSVCRT).компиляторы обеспечивают доступ к
функциональности среды Microsoft C Runtime и некоторым
специализированным-языковым библиотекам.
Мы использовали версию 3.4.5, команда
компилирования g++.
.2 Borland Builder
Информация взята с сайта [2]. Embarcadero® C++
Builder® XE является единственным настоящим RAD C++ инструментом и компонентом
программного обеспечения, предназначенного для ультрабыстрой разработки
высоко-сопровождаемых Windows приложений с графическим интерфейсом для Windows
и основных платформ.
Мы использовали версию 6.10, команда
компилирования bcc32.exe
.3 Watcom
Информация взята с сайта [4]. Open Watcom
является проектом с открытым исходным кодом для поддержания и укрепления Watcom
C, C++, Fortran кросс-компиляторов и инструментов. Лицензии Open Source от
Sybase позволяет свободное коммерческое и некоммерческое использование Open
Watcom. Watcom компилятор имеет ряд преимуществ перед другими свободными
компиляторами, такие как полная поддержка 16-битных DOS, Windows.. Open Watcom
C/C++ компилятор в свободном доступе, компилятор для 16-битных Windows и OS / 2
устройств. Наконец, Open Watcom это комплексный пакет, легкий в установке и
использовании, с полным набором инструментов и документации.
Мы использовали версию 1.9, команда
компилирования wcl386.
.4 Intel C++
Информация взята с сайта [3]. Intel® C++
Compiler Professional Edition раскрывает огромный потенциал следующего поколения
многоядерных процессоров Intel. Professional Edition не только поставляется с
широкими возможностями передовых оптимизаций компилятора, многопоточностью, и
поддержкой процессора, в том числе автоматического процессора отправки,
векторизации и предварительной выборки данных, он также имеет оптимизированные
C++ шаблоны для параллелизма, математической обработки и мультимедийных
библиотек.
Мы использовали версию 11, команда
компилирования icl. При запуске компилятора через командную строку столкнулись с
проблемой настройки, поэтому запуск компиляции производился через Visual
Studio.
.5 Visual C++
Информация взята с сайта [5]. Visual C++ - это
продукт корпорации Microsoft, предоставляющий интегрированную среду разработки
для языков программирования C, C++ и C++/CLI. Visual C++ 2008 предоставляет
многофункциональную и гибкую среду разработки для создания приложений на базе
Microsoft Windows и Microsoft .NET. Компилятор поддерживает управляемое
последовательное построение. Компилятор поддерживает микроархитектуру ядра
Intel. Встроенные компоненты поддерживают новейшие процессоры AMD и Intel.
Мы использовали версию 2008, команда
компилирования cl.
Существует множество программ для измерения
времени и памяти, мы измеряли при помощи программы run.exe, используется при
проведении олимпиад по программированию.
Для начала сравним характеристики выполнения
программ на примере простого кода. Программа ниже получает в качестве входного
параметра число k и выводит сумму 1+2+…+k (считая ее в цикле)
#include <stdio.h>main(){i,
k;s = 0;( "file.in", "r", stdin );( "file.out",
"w", stdout );("%d",&k);(i = 0; i <= k; i++){= s +
i;
};(stdout,"sum is %d\n",
s);
return 0;
}
Представим результаты в следующих таблицах.
Таблица 1
Время выполнения программы для различного k (с)
Выделено минимальное время компиляции в каждом
столбце.
k
|
1
|
1
000
|
100
000
|
10
000 000
|
1
000 000 000
|
MinGW
|
0.00
|
0.01
|
0.03
|
0.03
|
3.67
|
Builder
|
0.08
|
0.09
|
0.09
|
0.11
|
0.92
|
Watcom
|
0.09
|
0.09
|
0.09
|
0.81
|
Visual
C++
|
0.01
|
0.03
|
0.03
|
0.03
|
0.78
|
Intel
C++
|
0.00
|
0.01
|
0.03
|
0.03
|
0.22
|
Таблица 2 - затраченная память на выполнение
программы (Кб)
k
|
1
|
1
000
|
100
000
|
10
000 000
|
1
000 000 000
|
MinGW
|
1228
|
1324
|
1324
|
1292
|
1296
|
Builder
|
3388
|
3368
|
3384
|
3376
|
3372
|
Watcom
|
3428
|
3252
|
3240
|
3256
|
3244
|
Visual
C++
|
1416
|
1408
|
1408
|
1432
|
1436
|
Intel
C++
|
1416
|
1416
|
1416
|
1412
|
1388
|
Таблица 3 - размер полученного *exe файла (Кб)
MinGW
|
18
|
Builder
|
165
|
Watcom
|
36
|
Visual
C++
|
8
|
Intel
C++
|
128
|
Далее в работе аналогичным образом проводится
сравнение на более сложных задачах
2. Обзор задач
Задача 1. Посчитать количество способов
расстановки k ферзей на шахматном поле размером N на N так, чтобы они не били
друг друга [6].
Задача 2. Найти количество циклов длинной 5 в
произвольном графе [7].
Задача 3. Найти количество циклов длинной 10 в
произвольном графе [7].
Задача 4. Найти число способов расставить 144
короля на доске 24 на 24 так, чтоб они не били друг друга [8].
3. Тестирование
Время работы в секундах в зависимости от разных
ключей компиляции приведено в следующих таблицах. Выделено минимальное время в
каждом столбце.
Ключ
оптимизации
|
k
|
|
2
(N=700)
|
3
(N=80)
|
4
(N=35)
|
5
(N=20)
|
6
(N=16)
|
-O0
|
720.58
|
408.05
|
853.90
|
411.62
|
506.21
|
-O1
|
391.03
|
221.16
|
531.15
|
249.59
|
321.78
|
-O2
|
388.55
|
234.75
|
494.38
|
236.28
|
305.54
|
-O3
|
423.37
|
195.31
|
414.96
|
237.88
|
303.38
|
Ключ
оптимизации
|
K
|
|
2
|
3
|
4
|
5
|
6
|
-od
|
1066.56
|
714.39
|
1873.54
|
874.96
|
1046.33
|
-oneatx
-zp4
|
488.66
|
320.94
|
685.28
|
319.85
|
370.83
|
-ol
|
889.21
|
534.38
|
1676.56
|
767.29
|
916.58
|
-on
|
867.38
|
560.14
|
1607.11
|
768.80
|
924.48
|
-ot
|
873.90
|
530.20
|
1624.84
|
725.37
|
924.59
|
Builder
k
|
|
2
|
3
|
4
|
5
|
6
|
-Od
|
721.27
|
469.14
|
1046.30
|
484.88
|
589.84
|
-O2
|
716.01
|
484.15
|
1080.57
|
480.76
|
601.49
|
-Ox
|
717.57
|
510.92
|
1077.09
|
481.01
|
638.89
|
-Ot
|
712.83
|
480.25
|
1123.11
|
492.89
|
616.73
|
Intel C++
Ключ
оптимизации
|
k
|
|
2
|
3
|
4
|
5
|
6
|
/Od
|
365.20
|
168.71
|
1263.90
|
547.84
|
687.01
|
/O1
|
361.03
|
164.96
|
510.15
|
235.25
|
314.06
|
/O2
|
366.13
|
170.73
|
425.77
|
207.15
|
289.86
|
/O3
|
382.97
|
175.89
|
414.92
|
203.85
|
263.35
|
/Ox
|
364.18
|
174.63
|
426.76
|
204.75
|
287.57
|
C++
Ключ
оптимизации
|
|
2
|
3
|
4
|
5
|
6
|
/Od
|
678.32
|
316.57
|
875.63
|
263.41
|
507.35
|
/O1
|
411.98
|
310.50
|
666.37
|
281.16
|
356.17
|
/O2
|
353.30
|
325.03
|
590.09
|
262.13
|
343.01
|
/Ox
|
367.26
|
320.43
|
600.28
|
262.81
|
344.34
|
Далее мы заменили встроенный тип на собственный
и переопределили для него операцию инкремента в данных программах и провели
тесты еще раз. Результаты изменились, но незначительно. Данные можно
представить в виде диаграмм.
Диаграммы с разными ключами оптимизации, где
цифрами отмечены разные ключи компиляции
Watcom:
. -od
. -oneatx-zp4
. -ol
. -on
. -ot
C++:
. /Od
. /O1
. /O2
. /O3
. /Ox
C++:
. /Od
. /O1
. /O2
. /Ox
Builder:
. -Od
. -O2
. -Ox
. -Ot
:
. -O0
. -O1
. -O2
4. -O3
Диаграмма для двух ферзей на поле размером 500
на 500
Диаграмма для трех ферзей на поле размером 70 на
70
Диаграмма для четырех ферзей на поле размером 30
на 30
Диаграмма для пяти ферзей на поле размером 18 на
18
Диаграмма для шести ферзей на поле размером 15
на 15
Далее мы сравнили значения скорости выполнения
программ для k ферзей, после того как они компилировались различными
компиляторами с отключенной оптимизацией. Цифрами на диаграмме отмечены
различные компиляторы:
. MinGW
. Borland
Builder
. Intel
C++
. Visual C++
Нижняя ось диаграммы - число k.
Так же мы проверили скорости выполнения программ
для k ферзей, после компилирования с наиболее быстрой опцией компилятора
Исходя только из последней диаграммы, мы видим,
что самым быстрым компилятором является Intel C++ в тех случаях, когда k >
2, для k = 2 быстрее всех работает программа, скомпилированная компилятором
MinGW. В остальных случаях так же видно, что для k > 2 Intel C++ оказывается
более оптимальным.
Задача 2. Найти количество циклов длинной 5 в
произвольном графе. Цифрами отображены различные ключи компиляции
Задача 3 Найти количество циклов длинной 10 в
произвольном графе. Цифрами отображены различные ключи компиляции
В этой задаче в силу специфики программы важным
оказывается время компиляции. Следующая диаграмма отражает время компилирования
программы с различными опциями
Задача 4 Найти число способов расставить 144
короля на доске 24 на 24 так, чтоб они не били друг друга. Цифрами отображены
различные опции компилирования.
Также проводились тестирования для подсчета
количества циклов длинной 12 в графе, но они не компилировались 32-битовыми
компиляторами Intel C++ и Visual C++, MinGW выдал сообщение о нехватке памяти,
Watcom выдал сообщение о том, что используются слишком сложные конструкции.
Borland Builder скомпилировал, программа после компилирования работала 10
секунд для графа с 10 вершинами, для графа с 20 вершинами 8 минуту и более 2
часов для графа с 30 вершинами.
Заключение
Таким образом, мы провели несколько различных
тестов для наших компиляторов, сравнивая скорость выполнения и скорость
компилирования. Рассмотрели подробно опции компилирования у каждого из
компиляторов, выбрали самые подходящие. Изучив внимательно данные таблиц и
диаграмм, можно сделать вывод, что наиболее быстрым является компилятор Intel
C++ с опцией -O3, особенно это заметно на более сложных тестах. Вторым после
него идет Visual C++, чего и следовало ожидать, так как между ними есть
некоторая схожесть. Далее компиляторы определились неоднозначно и по разному
вели себя в каждой из программ. Но все же третьим по скорости является Watcom,
а точнее с опцией оптимизации -oneatx -zp4, которая является самой быстрой из
всех его опции. MinGW и Borland Builder находятся наравне друг с другом.
Компилирование более сложных программ, таких как подсчет циклов длиной 12 (где
более 1000 вложенных циклов) требует использования 64-битовых компиляторов, но
они будут рассмотрены в следующей работе.
Список использованных источников
компилятор опция язык
[1] MinGW.
Minimalist GNU for Windows [Электронный
ресурс].
MinGW.org,
2009.URL: http://www.mingw.org Загл. с экрана. Яз. англ.
[2] Embracadero
[Электронный ресурс]. Embarcadero Technologies, Inc., 2010 URL:
http://www.embarcadero.com/ru/ Загл. с экрана. Яз.
англ.
[3] Intel
[Электронный
ресурс].
Intel Corporation, URL: http://intel.com
Загл.
с
экрана.
[4] Open
Watcom [Электронный
ресурс].Some
rights recerved Creative Commons URL: http://www.openwatcom.org Яз.англ.
[5] Microsoft
Visual Studio [Электронный
ресурс].
Microsoft Corp., 2010
URL:
http://msdn.microsoft.com/ru-ru/vstudio/ Загл. с экрана. Яз. англ.
[6]
Караваев А. М. Подсчет расстановок ферзей на шахматной доске // Казанская
наука, 2010. № 10. С. 13-16.
[7]
Караваев А. М., Воропаев А. Н. Эффективность распараллеливания явных формул для
подсчета коротких циклов в графе : труды [Электронный ресурс] /
"Параллельные вычислительные технологии' 2010" : труды международной
научной конференции. г. Уфа : Уфимский государственный авиационный технический
ун-т. 1 CD-ROM. Заглавие с этикетки диска.
[8]
Караваев А. М. Задача о расстановке шахматных королей : материалы //
Современные проблемы гуманитарных и естественных наук: материалы II
международной научно-практической конференции. г. Москва, 2010. Том II. С.
12-16.
1.