記事一覧

luaがなんでも速い訳じゃない

luaとperlなどの速度比較は少し検索すればいろいろ出てきますが、どれもluaが圧倒的に速いことになっています。

まあ確かに単純なループを回せば、perlの3倍くらい速いです。

で、FXの指標計算のためのperlスクリプト(約800行)をluaで書き直してみました。時は金ですからね。

さぞや速くなるかと思いきや、激遅じゃないですか。書きなおすの結構しんどかったのに・・・

何が遅いかと調べたら、perlのsplitとjoinに相当する関数です。
luaにはsplitに相当する標準関数は無いので、ネットで拾ってきて定義していますが。

luaのtable.concatは、perlのjoinの10倍以上遅いです。

タブ区切りとかのテキストファイル←→配列、というperlの王道?手法はluaには向かないようですね。

以下はテストスクリプトと実行結果です。

luaのスクリプト:
function split(delim, str)
if string.find(str, delim) == nil then
return { str }
end
local result = {}
local pat = "(.-)" .. delim .. "()"
local lastPos
for part, pos in string.gfind(str, pat) do
table.insert(result, part)
lastPos = pos
end
table.insert(result, string.sub(str, lastPos))
return result
end

loop = 1000000
a = {"abc", 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9}

t1 = os.clock()

for i = 0, loop do
b = table.concat(a, "\t")
end

t2 = os.clock()
print(loop.." times of table.concat: "..(t2 - t1).." sec")

t3 = os.clock()
for i = 0, loop do
aa = split("\t", b)
end
t4 = os.clock()

print(loop.." times of split: "..(t4 - t3).." sec")

---------------------------------
1000000 times of table.concat: 6.857 sec
1000000 times of split: 5.236 sec
---------------------------------


perlのスクリプト:
$loop = 1000000;
@a = ("abc", 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9);
$t1 = scalar(times);
for($i = 0; $i <= $loop; $i++) {
$b = join("\t", @a);
}
$t2 = scalar(times);

print $loop." times of join: ".($t2 - $t1)." sec\n";

$t3 = scalar(times);
for($i = 0; $i <= $loop; $i++) {
@aa = split("\t", $b);
}
$t4 = scalar(times);

print $loop." times of split: ".($t4 - $t3)." sec\n";

---------------------------------
1000000 times of join: 0.561 sec
1000000 times of split: 1.81 sec
---------------------------------

実行環境:
OS: Windows 7 64bit
CPU: AMD Phenom II X6 1090T @3.8GHz
luaforwindows 5.1.4
ActivePerl x64 5.14.2

コメント一覧

コメント投稿

投稿フォーム
名前
Eメール
URL
コメント
削除キー
公開設定
投稿キー
投稿キーには投稿キーと入力してください。(スパム対策。)