TESTY kompilatorów: C++, D oraz Delphi.

Oto druga wersja testów kompilatorów i zintegrowanych środowisk programistycznych. Wersja z dnia 2013-06-13.

Charakterystyka testów

1. Co mierzono
W testach mierzona była tylko wydajność, czyli szybkości działania wygenerowanego kodu binarnego - pliku exe. Nie brano pod uwagę jakości wyniku - obliczeń, np. w obliczaniu wartości wyznacznika macierzy. Nieraz szybkość obliczeń była okupiona jakością obliczeń, tzn. wyniki były mniej dokładne, z większymi błędami. Dotyczy to operacji na liczbach zmiennoprzecinkowych.
Jednak nie zawsze tak jest!
Przykładowo dla wxDev-C++ w teście nr 12 - obliczanie układu równań otrzymano najszybszy kod wynikowy, który jednocześnie generował najlepszy wynik (dużo lepszy od pozostałych)!

2. Postać kodu wykonywalnego:
- pliki wykonywalne exe na konsolę (tryb tekstowy)
- kod 32-bitowy

3. Środowiska
- Windows 7 32-bit na Intel Pentium Dual-core E5400 2,7 GHz; 2 GB RAM
- Windows 7 64-bit na AMD Athlon FX-6100 6 core 3,3 GHz; 8 GB RAM

4. Zestaw obejmuje 15 testów:
01. Obliczenie 50 000 000 razy w = sin(w) + w, zaczynając od w=1.0 na liczbach typu double
02. Faktoryzacja liczby typu int64
03. Faktoryzacja 32-bitowych liczb typu unsigned int (uint, Longword) - wypisywanie wielu linii w konsoli przez printf
04. Szukanie liczb doskonałych w przedziale od 3 do 1500 000, na 32-bitowych liczbach całkowitych ze znakiem (int/Integer)
05. Mnożenie macierzy o wyrazach typu double
06. Mnożenie macierzy o wyrazach typu float
07. Największa Wspólna Wielokrotność liczb int64
08. Sortowanie tablicy liczb algorytmem QuickSort na int
09. Sortowanie tablicy liczb algorytmem QuickSort na double
10. Szyfrowanie algorytmem RC4
11. Wyznacznik macierzy stopnia 11 na wyrazach typu double
12. Liczenie układu 2000 równań metodą eliminacji Gaussa na wyrazach typu double (wybieranie najlepszego wiersza)
13. Liczenie układu 2000 równań metodą eliminacji Gaussa na wyrazach typu double (wybieranie najlepszego wiersza i kolumny)
14. Liczenie wartości liczby Fibonacciego na wyrazach typu unsigned int algorytmem rekurencyjnym
15. Wielokrotne obliczanie wielu funkcji matematycznych: sin, cos, tan, sqrt, pow, log, floor, ceil, fabs

Pełne kody źródłowe na www.epokay.net/artur/cpp_najlepszy.htm#testy

5. Testowane kompilatory i środowiska IDE - w sumie 13
Testowane języki programowania to przede wszystkim C++ oraz język D i Delphi (Object Pascal).
Lista kompilatorów:
- Intel C++ Composer XE 2013 Update 3 13.1 - płatne
- Intel C++ 10.0.026 - płatne, stare

- MS Visual 2010 Ultimate - płatne
- MS Visual C++ 6.0 - płatne, stare

- Open Watcom C/C++ 1.9: free

- Code::Blocks 12.11 (GCC 4.7): free
- wxDev-C++ (GCC 4.6): free
- Dev-C++ 5.4.2 (GCC 4.7.2): free

- DigitalMars D v2.062: free
- DigitalMars C++ 8.56: free

- Borland Delphi 7.0 PE: free
- Borland C++ Builder 6.0 Canterwood / Enterprise Suite - płatne, stare

- Embarcadero C++ Builder XE1 - płatne

6. Ustawienia kompilacji - optymalizacji
W celu uzyskania najszybszego kodu starałem się dobrać odpowiednie opcje optymalizacji, testując różne kombinacje ustawień kompilatora.
Nie zawsze wybranie najlepszej (sugerowanej, np. -O3) kompilacji dawało najlepsze wyniki,
nieraz najlepszy wynik uzyskiwałem przy wyłączeniu wszystkich optymalizacji kodu. Zatem tutaj trzeba było eksperymentować.

7. Jak mierzono
Każdy plik exe był uruchamiany wielokrotnie (min. 5 razy) i wybierano najlepszy czas.

Wyniki - podsumowanie

Mamy zatem 13 kompilatorów x 15 testów = 195 różnych plików exe.
Ponadto testowałem włączanie różnych opcji kompilatora (min. 4), co daje minimum: 195 * 4 = 780 plików exe do uruchomienia.

1. Dla środowiska: Windows 7 32-bit na Intel Pentium Dual-core E5400 2,7 GHz; 2 GB RAM otrzymałem następujące wyniki:
Konkretne szczegółowe dane testu: plik Excell.

Suma wyników 15 testów syntetycznych:
Wynik testu syntetycznego

Dodatkowy bardzo mocny test - uczenie sieci neuronowej (dużo różnych obliczeń na liczbach rzeczywistych typu double oraz wiele innych):
Wynik testu - uczenie SSN

Wnioski

Jak zawsze kompilatory pochodzenia borlandowskiego są najgorsze w wydajności generowanego kodu.
Wszystkie trzy testowane: Builder 6, Delphi 7, Embarcadero Builder XE - zostają w tyle i to znacząco od pozostałych.
Nawet najnowszy Embarcadero C++ Builder XE, który często używam, okazał się niestety najgorszy w teście. Szkoda, bo bardzo ułatwia tworzenie aplikacji okienkowych pod Windows.

Pozytywne zaskoczyło mnie wxDev-C++ (z kompilatorem GCC 4.6) - jest darmowe a okazało się dobrym kompilatorem.
Ponadto posiada zintegrowane środowisko IDE umożliwiające wygodne tworzenie aplikacji okienkowych (na bibliotekach wxWidgets) w stylu C++ Buildera.
Jeszcze lepiej sprawuje się Dev-C++ 5.4.2 (z kompilatorem GCC 4.7.2) - również darmowe.

Równie dobrym kompilatorem jest Open Watcom. Niestety jego IDE jest dosyć przestarzałe i nie ułatwia tworzenia aplikacji okienkowych.

Godnym uwagi jest środowisko Code::Blocks (v 12.11 z kompilatorem GCC 4.7). Tworzy kod dorównujący MS Visual C++ i posiada bardzo rozwinięte środowisko IDE.

Zwycięzcy

Najlepszymi okazały się kompilatory: Microsoft Visual C++ 2010 oraz Intel.
VC++ generuje bardzo dobry kod a pliki wykonywalne są bardzo małe.

Kompilator Intela potrafi wykorzystać wieloprocesorowość systemu (wielordzeniowe procesory).
Kompilator ten można zintegrować ze środowiskiem Visual C++ (2010).
Intel C++ Composer XE 2013 Update 3 13.1 tworzy nieraz niebywale szybki kod wynikowy jednak jest płatny i to słono.
Uwaga! Intel został oskarżony o celowe niewykorzystywanie dodatkowych możliwości (np. SSE3) innych procesorów niż intelowskie (nawet gdy posiadają lepsze wyposażenie)! Zatem na procesorach np. AMD kod wynikowy z kompilatora Intel może być celowo nie optymalizowany i przez to wolniej wykonywany.

Autor: Artur Czekalski www.epokay.net/artur