LoginSignup
3
1

More than 5 years have passed since last update.

Nimのバックエンドコンパイラごとのベンチマーク

Last updated at Posted at 2018-11-05

はじめに

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にしているぐらいで、他はデフォルトのままです。

コード

ほぼ変えていません。

bench.nim
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から手でコンパイルする必要がありそうです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1