Сравнение компиляторов для трудных задач
Сравнение компиляторов для
трудных задач
ВВЕДЕНИЕ
компилятор задача инструмент
Для решения вычислительных задач немаловажной
является проблема выбора инструмента. При вычислениях с использованием
бинарного кода важно, чтобы код был оптимальный по затратам вычислительных
ресурсов и ресурсов памяти. Помимо этого обнаружилась серьезная проблема
времени компиляции исходного кода. Так, в некоторых комбинаторных задачах, где
используются тысячи многократно вложенных циклов, некоторые компиляторы отказываются
компилировать. В связи с этим актуальной является проблема выбора «правильного»
компилятора. Практическая значимость нашей работы заключается в проведении
тестов, изучении компиляторов и выборе наиболее подходящего. В рамках работы мы
ограничились наиболее известными компиляторами языка С++. Для исследования мы
выбрали несколько компиляторов, такие как: 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.
На данном этапе работы мы сравниваем характеристики
выполнения программ на примере простого кода:
#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);
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,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
|
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 так, чтобы они не
били друг друга
Задача 2. Найти количество циклов длинной 5 в
графе
Задача 3. Найти количество циклов длинной 10 в
графе
Задача 4. Расставить максимальное количество 144
короля на поле 24 на 24 так, чтоб они не били друг друга
Тестирование
Задача 1.
Время работы в секундах приведено в следующих
таблицах
MinGW
Ключ оптимизации
|
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
|
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
|
Borland 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
|
481.01
|
638.89
|
-Ot
|
712.83
|
480.25
|
1123.11
|
492.89
|
616.73
|
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++
Ключ оптимизации
|
K
|
|
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
|
343.01
|
/Ox
|
367.26
|
320.43
|
600.28
|
262.81
|
344.34
|
Далее мы заменили встроенный типа на собственный
и переопределили для него операцию инкремента в данных программах и провели
тесты еще раз. Результаты изменились, но незначительно. Данные можно представить
в виде диаграмм.
Диаграммы с разными ключами оптимизации:
Диаграмма для двух ферзей на поле размером 500
на 500
Диаграмма для трех ферзей на поле размером 70 на
70
Диаграмма для четырех ферзей на поле размером 30
на 30
Диаграмма для 5 ферзей на поле размером 18 на 18
Диаграмма для шести ферзей на поле размером 15
на 15
Далее мы сравнили значения скорости выполнения
программ для k ферзей, после того
как они компилировались различными компиляторами с отключенной оптимизацией.
Так же мы проверили скорости выполнения программ
для k ферзей, после
компилирования с наиболее быстрой опцией компилятора
Исходя только из последней диаграммы, мы видим,
что самым быстрым компилятором является Intel
C++ в тех случаях,
когда k > 2, для k = 2 быстрее всех работает программа, скомпилированная
компилятором MinGW. В
остальных случаях так же видно, что для k
> 2 Intel
C++ оказывается
более оптимальным.
Задача 2
.
Задача 3
Следующая диаграмма отражает время
компилирования программы с различными опциями
В свою очередь время выполнения программы
отражено в следующей диаграмме
Задача 4
Также проводились тестирования для подсчета
количества циклов длинной 12 в графе, но они не компилировались 32-битовыми
компиляторами Intel
C++ и Visual
C++, MinGW
выдал сообщение о нехватке памяти, Watcom
выдал сообщение о том, что используются слишком сложные конструкции. Borland
Builder скомпилировал,
программа после компилирования запускалась более 2 часов для графа с 30
вершинами.
ЗАКЛЮЧЕНИЕ
Таким образом, мы провели несколько различных
тестов для наших компиляторов, сравнивая скорость выполнения и скорость
компилирования. Рассмотрели подробно опции компилирования у каждого из
компиляторов, выбрали самые подходящие. Изучив внимательно данные таблиц и
диаграмм, можно сделать вывод, что наиболее быстрым является компилятор Intel
C++, особенно это
заметно на более сложных тестах. Вторым после него идет Visual
C++, чего и
следовало ожидать, так как между ними есть некоторая схожесть. Далее
компиляторы определились неоднозначно и по разному вели себя в каждой из
программ. Но все же третьим по скорости является Watcom,
а точнее с опцией оптимизации -oneatx
-zp4, которая является
самой быстрой из всех его опции. MinGW
и Borland Builder
находятся наравне друг с другом.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. MinGW.
Minimalist
GNU for
Windows [Электронный
ресурс]. MinGW.org,
2009.URL: http://www.mingw.org
Загл. с экрана. Яз. англ
. Embracadero
[Электронный ресурс]. Embarcadero Technologies, Inc., 2010 URL:
http://www.embarcadero.com/ru/ Загл.
с
экрана.
Яз.
англ
. Intel
[Электронный ресурс]. Intel Corporation,
URL:http://intel.com Загл.
с
экрана.
. Open
Watcom [Электронный ресурс].Some rights recerved Creative Commons URL:
http://www.openwatcom.org Яз.англ
. Microsoft
Visual Studio [Электронный ресурс].Microsoft Corp., 2010 URL:
http://msdn.microsoft.com/ru-ru/vstudio/ Загл.
с
экрана.
Яз.
англ