Для эксперимента взял первую попавшуюся реализацию пузырьковой сортировки с GitHub'а
Компилировал с опциями -g, -O1, -O2, -O3 и без опций
Получилось интересно и неожиданно.
Для запуска тестов использовал такой скрипт:
#!/bin/bashМеняя параметр OPT.
OPT="-O3"
g++ $OPT bubble.cpp -o bubble1
clang++ $OPT bubble.cpp -o bubble2 #-stdlib=libstdc++
clang++ $OPT -stdlib=libc++ bubble.cpp -o bubble3 #-stdlib=libc++
#ls -slh
#exit;
sleep 3
time ./bubble1 > /dev/null
sleep 3
time ./bubble2 > /dev/null
sleep 3
time ./bubble3 > /dev/null
Поясню, что здесь компилируется.
g++ $OPT bubble.cpp -o bubble1
Используется gcc
clang++ $OPT bubble.cpp -o bubble2 #-stdlib=libstdc++
Используется clang со стандартной библиотекой libstdc++ от gcc
clang++ $OPT -stdlib=libc++ bubble.cpp -o bubble3 #-stdlib=libc++
Используется clang со своей собственной стандартной библиотекой libc++
Опция | gcc | clang -stdlib=libstdc++ (gcc) | clang -stdlib=libc++ |
---|---|---|---|
-g | real 0m3.337s user 0m3.335s sys 0m0.004s |
real 0m3.294s user 0m3.296s sys 0m0.000s |
real 0m3.323s user 0m3.325s sys 0m0.000s |
без опций | real 0m3.334s user 0m3.336s sys 0m0.000s |
real 0m3.293s user 0m3.295s sys 0m0.000s |
real 0m3.320s user 0m3.318s sys 0m0.004s |
-O1 | real 0m1.735s user 0m1.735s sys 0m0.000s |
real 0m1.485s user 0m1.486s sys 0m0.000s |
real 0m1.493s user 0m1.494s sys 0m0.000s |
-O2 | real 0m1.516s user 0m1.517s sys 0m0.000s |
real 0m1.522s user 0m1.523s sys 0m0.000s |
real 0m1.495s user 0m1.492s sys 0m0.004s |
-O3 | real 0m1.510s user 0m1.506s sys 0m0.004s |
real 0m1.534s user 0m1.535s sys 0m0.000s |
real 0m1.498s user 0m1.499s sys 0m0.000s |
Размеры бинарников:
Опция | gcc | clang -stdlib=libstdc++ (gcc) | clang -stdlib=libc++ |
---|---|---|---|
-g | 22K | 28K | 65K |
без опций | 9,2K |
8,3K | 15K |
-O1 | 8,9K | 8,4K | 12K |
-O2 | 8,9K | 8,1K | 12K |
-O3 | 8,9K | 8,1K | 12K |
Понятно, что по такому примеру корректно сравнивать компиляторы нельзя, но для меня как для приверженца GNU компилятора результаты получились неожиданными.
По сути clang превзошел gcc во всех направлениях.
Для меня основной вывод такой:
Clang заслуживает внимания и заслуживает того, что бы к нему присмотреться. Тем более сообщения об ошибках которые он выдает информативнее чем сообщения выдаваемые gcc.
До этого я никогда не пользовался клэнгом (силангом). Сталкнулся с ним по необходимости. Думаю, что стоит попробовать использовать его в своей работе.
Мои версии clang и gcc:
gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)
Debian clang version 3.2-7ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2)