Lua v.s. Lua-Jit

Lua-JITを試してみました.
Kyoto Tychoonで使えるという話を見かけましたので.
かずぽんブログ • kyototycoonのLuaスクリプティング拡張をLuaJITにしてみた

まず,FreeBSDLuaをインストール.

# cd /usr/ports/lang/lua
# make
# make install
# /usr/local/bin/lua51/lua -v
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
# ls -l /usr/local/lib/lua51/liblua.*
-r--r--r--  1 root  wheel  213184 Nov  4 14:33 /usr/local/lib/lua51/liblua.a
lrwxr-xr-x  1 root  wheel      15 Nov  4 14:33 /usr/local/lib/lua51/liblua.so -> liblua-5.1.so.1

続いて,Lua-JITをインストール.

# cd /usr/ports/lang/luajit/
# make
# make install
# /usr/local/bin/luajit -v
LuaJIT 2.0.0 -- Copyright (C) 2005-2012 Mike Pall. http://luajit.org/
# ls -l /usr/local/lib/libluajit-5.1.*
-rw-r--r--  1 root  wheel  542912 Nov  4 20:02 /usr/local/lib/libluajit-5.1.a
lrwxr-xr-x  1 root  wheel      22 Nov  4 20:02 /usr/local/lib/libluajit-5.1.so.2 -> libluajit-5.1.so.2.0.0
-rwxr-xr-x  1 root  wheel  384944 Nov  4 20:02 /usr/local/lib/libluajit-5.1.so.2.0.0

まずは,適当に,ただのforループのテストをします.

# /usr/local/bin/lua51/lua -e 'local starttime = os.time(); for i = 0, 1000000000, 1 do local a=0;  end; local endtime=os.time();print(os.difftime(endtime,starttime));'                                                           
18
# /usr/local/bin/luajit -e 'local starttime = os.time(); for i = 0, 1000000000, 1 do local a=0;  end; local endtime=os.time();print(os.difftime(endtime,starttime));'
1

1億回のループが,18秒から1秒に?!

C言語だとどうなのでしょう.

/**********
 *  cc test.cc -o test -Wall
 **********/

#include <stdio.h>
#include <time.h>


int main()
{
  time_t starttime, endtime;
  int i;
  starttime = time(NULL);
  for (i = 0; i < 1000000000; ++i)
  {
    int a = 0;
  }
  endtime = time(NULL);

  printf("%d\n", endtime - starttime);

  return(0);
}

やってみて分かったのですが,最適化オプションによって大きく変わりました.

# cc test.c -o test -Wall -O0; ./test 
test.c: In function 'main':
test.c:16: warning: unused variable 'a'
4
# cc test.c -o test -Wall -O1 ; ./test
test.c: In function 'main':
test.c:16: warning: unused variable 'a'
0
  • O0だと4秒,-O1だとゼロ秒と,一応,C言語の貫禄を見せつけました.

でも,最適化無しの4秒だと,Lua-JITに負けてますね.