2014-02-24
【LuaJIT】たらい回しとフィボナッチでベンチマーク
[ PR ]
LuaJITが速いらしいのでベンチマーク
ネットサーフィンしていたところ、LuaJITがかなり速いということでベンチマークしてみました。
条件は以下の通りです。
- マシン:
- MacBookAir (Late 2010)
- Mac OS X 10.9.1
- 1.6 GHz Intel Core 2 Duo
- 4GB 1067 MHz DDR3
- 言語:
- C
- Lua
- LuaJIT
- Java
- JavaScript
- ベンチマーク方法:
- Tak関数(パラメータは18,9,0)
- フィボナッチ関数(パラメータは38)
- 測定方法:
- Unixのtimeコマンドで計測
- realを採用
使用した言語のバージョンと種類
GCC
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix
Lua
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio
LuaJit
LuaJIT 2.0.2 -- Copyright (C) 2005-2013 Mike Pall. http://luajit.org/
Java
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)
Node.js
v0.10.24
ソースコード
Tak
C
#include "stdio.h"
int tak(int x, int y, int z) {
if (y<x)
return tak(tak(x-1, y, z), tak(y-1, z, x), tak(z-1, x, y));
else return z;
}
int main(){
printf("%d",tak(18,9,0));
}
Lua
function tak (x, y, z)
if y < x then
return tak(tak(x-1, y, z), tak(y-1, z, x), tak(z-1, x, y))
else return z
end
end
print(tak(18,9,0))
Java
class Tak {
static int tak(int x, int y, int z) {
return (x <= y) ? y : tak(tak(x-1, y, z), tak(y-1, z, x), tak(z-1, x, y));
}
static public void main(String args[]) {
int x, y, z;
x = 18; y = 9; z = 0;
System.out.println("tak(" + x + ", " + y + ", " + z + ") = " + tak(x, y, z));
}
}
JavaScript
function tak(x,y,z){
return (x <= y) ? y :
tak(tak(x-1, y, z),
tak(y-1, z, x),
tak(z-1, x, y));
}
console.log(tak(18,9,0));
フィボナッチ(Fib)
C
#include <stdio.h>
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;
}
Lua
function fib(n)
if n < 2 then return n end
return fib(n - 2) + fib(n - 1)
end
print(fib(38))
Java
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));
}
}
JavaScript
function fib(n) {
if (n < 2) return n;
return fib(n - 2) + fib(n - 1);
}
console.log(fib(38));
結果
Tak
時間が短いほど高いパフォーマンスです。
言語 | 時間(ms) |
---|---|
C (gcc) | 208 |
C (gcc -O3) | 154 |
Lua | 2852 |
LuaJIT | 294 |
Java (Oracle) | > 120000 |
JavaScript (node) | > 120000 |
コメント
JavaScriptとJavaは2分たっても終わりませんでした。
C -O3でも200msかかったので、LuaJITはかなり速いということがわかります。凄いですね。
Java…。
フィボナッチ
時間が短いほど高いパフォーマンスです。
言語 | 時間(ms) |
---|---|
C (gcc) | 1907 |
C (gcc -O3) | 1590 |
Lua | > 1000000 |
LuaJIT | 1580 |
Java (Oracle) | 1640 |
JavaScript (node) | 1932 |
コメント
あまり差が出ませんでしたが、この中ではLuaJITがCを凌駕して最速となりました。
同じJITを使っているJava、JavaScriptも同様の結果となりました。
まとめ
LuaJITは思いのほか高速で、場合によってはC言語より速い場合がありそうです。
LuaJITはかなり盛り上がっているので、コミュニティ的にも期待できそうですね。