====== フィボナッチ数列でベンチマーク ======
MA-E3xxには、スクリプト言語として
* Python3.4
* Python2.7 (v2.2.0 以降追加)
* Perl5.8
* LuaJIT-2.0.2
* nodejs-0.10 (v2.2.0 以降削除予定)
を導入してあります。
せっかくなので、[[http://d.hatena.ne.jp/satosystems/20121228/1356655565|satosystemsの日記 - フィボナッチで各種言語をベンチマーク]] で行っている\\
ベンチマークテストを、MA-E3xx上で各種言語でテストしてみました。
\\
===== テスト =====
==== Python ====
コードは下記になります。
def fib(n):
if n < 2: return n
return fib(n - 2) + fib(n - 1)
print(fib(38))
実行結果はこのようになりました。
user1@plum:~$ time python3 fib.py
39088169
real 2m35.226s
user 2m33.116s
sys 0m0.072s
\\
==== Perl ====
sub fib($) {
return $_[0] if ($_[0] < 2);
return fib($_[0] - 2) + fib($_[0] - 1);
}
print fib(38), "\n";
実行結果はこのようになりました。
user1@plum:~$ time perl fib.pl
39088169
real 4m5.286s
user 4m1.284s
sys 0m0.572s
\\
==== LuaJIT ====
function fib(n)
if n < 2 then return n end
return fib(n - 2) + fib(n - 1)
end
print(fib(38))
実行結果はこのようになりました。
user1@plum:~$ time luajit fib.lua
39088169
real 0m9.108s
user 0m8.592s
sys 0m0.396s
JITコンパイラによりネイティブコードに変換されるだけあって、桁違いに速いです。
\\
==== node.js ====
function fib(n) {
if (n < 2) return n;
return fib(n - 2) + fib(n - 1);
}
console.log(fib(38));
実行結果はこのようになりました。
user1@plum:~$ time nodejs fib.js
39088169
real 0m7.108s
user 0m6.884s
sys 0m0.084s
さすがは V8 、LuaJITよりも高速でした。
\\
==== Ruby2.0 ====
Ruby2.0 を追加で導入し、テストしてみました。
def fib(n)
return n if (n < 2)
return fib(n - 2) + fib(n - 1)
end
puts fib(38)
実行結果はこのようになりました。
user1@plum:~$ time ruby2.0 fib.rb
39088169
real 0m58.870s
user 0m56.992s
sys 0m0.952s
\\
==== Ruby1.9 ====
Ruby2.0 と同じコードを、Ruby1.9 で実行してみます。
user1@plum:~$ time ruby1.9.1 fib.rb
39088169
real 1m20.224s
user 1m18.072s
sys 0m0.944s
\\
==== PHP5 ====
user1@plum:~$ time php5-cgi fib.php
X-Powered-By: PHP/5.5.9-1ubuntu4.3
Content-type: text/html
39088169
real 2m39.913s
user 2m38.097s
sys 0m0.067s
Python3 と同程度、こんなところでしょうか。
\\
==== Java SE Embedded 8 ====
コンパイルする言語なので、速いと思いますが一応。
public class fib {
static int fib(int n) {
if (n < 2) return n;
return fib(n - 2) + fib(n - 1);
}
public static void main(String[] args) {
System.out.println(fib(38));
}
}
実行結果は下記のようになりました。
user1@plum:/tmp$ time java fib
39088169
real 0m5.021s
user 0m2.024s
sys 0m2.796s
さすがは HotSpot によるJITコンパイルが効くだけあって、スクリプト言語よりも高速です。\\
VM の起動に時間がかかるせいか、"user" は短いですが "sys" で時間がかかっています。
\\
==== Java (OpenJDK 11) ====
OpenJDK 11 でも試してみます。
user1@plum:~$ time java fib
39088169
real 0m7.083s
user 0m2.139s
sys 0m4.703s
user1@plum:~$ time java fib
39088169
real 0m2.284s
user 0m2.157s
sys 0m0.114s
user1@plum:~$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu218.04.1)
OpenJDK Server VM (build 11.0.3+7-Ubuntu-1ubuntu218.04.1, mixed mode)
初回はキャッシュされてないので遅いですが、"user" の時間は Java SE embedded 8 とあまり遜色なさそうな感じです。
\\
==== GCC ====
ネイティブコードにコンパイルする、C言語でも試してみます。
#include
int fib(int n) {
if (n < 2) return n;
return fib(n - 2) + fib(n - 1);
}
int main(int argc, char *argv[]) {
printf("%d\n", fib(38));
return 0;
}
実行結果は下記のようになりました。
user1@plum:/tmp$ time ./fib
39088169
real 0m1.376s
user 0m1.332s
sys 0m0.012s
スクリプト言語やVM系とは比較にならないほど高速でした。
\\
==== Nim ====
いま注目の Nim では?
proc fib(n: int): int =
if n < 2:
return n
else:
return fib(n - 1) + fib(n - 2)
echo(fib(38))
user1@plum:~$ time ./fib
39088169
real 0m1.324s
user 0m1.313s
sys 0m0.004s
C よりも速いとは。
{{:mae3xx_tips:test_fib_benchmark:a614d39a.gif|Java or Mocha?}}