はじめに
https://qiita.com/tlllune/items/0472fc5546e40b5ad5f4
https://qiita.com/kubo39/items/0b7ebd33c60bff0e86a2
お二人の記事を見たのとたまたまiccを手に入れたので。
コンパイラ3種類 x オプション3種類です。
環境
i7-4600U 2.10Ghz
メモリ12GB
Nim 0.19.0
clang 6.0.0
gcc 7.3.0
icc 10.0.0.117
nim.cfgはコンパイラをclangにしているぐらいで、他はデフォルトのままです。
コード
ほぼ変えていません。
import math, times
const max = 10000000
var
sins, coses, num: float64 = 0.0
bTime = epochTime()
for i in 0..<max:
num = float64(i)
sins += sin(num)
coses += cos(num)
echo epochTime() - bTime
echo sins
echo coses
面倒なのでこんな感じのスクリプトを書きました。
変なechoは見栄えの問題です。
#!/bin/bash
file="bench.nim"
define=""
optimize=""
nim c -f "$define" "$optimize" --hints:off --verbosity:3 --cc:gcc -o:"gcc_bench" "$file"
nim c -f "$define" "$optimize" --hints:off --verbosity:3 --cc:icc -o:"icc_bench" "$file"
nim c -f "$define" "$optimize" --hints:off --verbosity:3 --cc:clang -o:"clang_bench" "$file"
echo "gcc"
time ./gcc_bench
echo ""
echo "icc"
time ./icc_bench
echo ""
echo "clang"
time ./clang_bench
echo ""
結果
特にオプションなし、一番早いと思われるパターン、一番実行ファイルのサイズが小さくなると思われるパターンの三種類。
オプションなし
gcc
0.8050589561462402
1.535343615350497
1.338538979005332
real 0m0.806s
user 0m0.803s
sys 0m0.000s
icc
0.5420560836791992
1.535343615350506
1.338538979005383
real 0m0.543s
user 0m0.543s
sys 0m0.000s
clang
0.7779979705810547
1.535343615350497
1.338538979005332
real 0m0.779s
user 0m0.777s
sys 0m0.000s
-d:releaseのみ
gcc
0.369373083114624
1.535343615350497
1.338538979005332
real 0m0.370s
user 0m0.363s
sys 0m0.004s
icc
0.4971959590911865
1.535343615350506
1.338538979005383
real 0m0.498s
user 0m0.498s
sys 0m0.000s
clang
0.4085111618041992
1.535343615350497
1.338538979005332
real 0m0.409s
user 0m0.408s
sys 0m0.000s
-d:release --opt:size
gcc
0.362727165222168
1.535343615350497
1.338538979005332
real 0m0.364s
user 0m0.363s
sys 0m0.000s
icc
0.4959828853607178
1.535343615350506
1.338538979005383
real 0m0.497s
user 0m0.495s
sys 0m0.000s
clang
0.4034528732299805
1.535343615350497
1.338538979005332
real 0m0.404s
user 0m0.404s
sys 0m0.000s
サイズ
gcc 51kB
icc 69kB
clang 51kB
結論
gccの最適化がすごい(小並)。
逆にiccはもともとそれなりに速いけど、あんまり最適化の効果が無い(たぶんコードにもよる)。
あとiccだけ計算結果が違う。
一応uccでもコンパイルしたんですが、実行ファイルのサイズがclang(デフォルト)と1バイト単位で同じになった上に、一切コンパイルメッセージが出なかったので、おそらくちゃんとコンパイル出来てないので消しました。
対応しているコンパイラのリスト
どなたかvccとかで試してみて下さい。
ちなみにリストに入ってないやつでも動くかもねって書いてありますが、ccでコンパイルしようとするとError: unknown C compiler
と出たので、対応してないコンパイラを使おうと思うとnimcacheから手でコンパイルする必要がありそうです。