2014-02-24

【LuaJIT】たらい回しとフィボナッチでベンチマーク

luajit2.jpg

[ 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

tak-lua.png

コメント

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

fib-lua.png

コメント

あまり差が出ませんでしたが、この中ではLuaJITがCを凌駕して最速となりました。

同じJITを使っているJava、JavaScriptも同様の結果となりました。

まとめ

LuaJITは思いのほか高速で、場合によってはC言語より速い場合がありそうです。

LuaJITはかなり盛り上がっているので、コミュニティ的にも期待できそうですね。

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.