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