ネットで、pcallを使うと遅くなると書いているサイトがあった。
その仕組みからいえばパフォーマンスに大きな影響を与えないだろうという予想があったので、調べた。予想そのままな結果になったため新規性は無いが、記録として書く。
結論
pcallは呼び出しコストは使用しない場合と比較すれば高いが、驚くほどではない。
また、内容の処理時間自体は特に差が無い。
呼び出しコストを調べる
ベンチマーク
pcallの呼び出しが通常の関数呼び出しと比較してどれくらいパフォーマンスに影響するかを調べた。
関数を繰り返し呼ぶコードの計算時間を、pcall呼び出しか否かで比較した。
function testfunc()
end
local start = os.clock()
for i = 0, 10000000 do
-- with pcall
pcall(testfunc)
-- without pcall
--testfunc()
end
print( os.clock() - start )
結果
pcallを利用すると、呼び出しコストはだいたい2倍弱になることがわかった。
回 | pcall使用 | pcall未使用 |
---|---|---|
1 | 1.78 | 0.97 |
2 | 1.8 | 0.89 |
3 | 1.81 | 0.94 |
pcall呼び出し内の実行効率を調べる
ベンチマーク
まず、pcall内での呼び出しとそれ以外ではパフォーマンスに影響するかを調べた。
素数をブルートフォースで探すコードの計算時間を、pcall呼び出し内か否かで比較した。
function primechecker()
local result = ""
for num=2, 100000 do
for i=2, num do
if math.mod(num, i) == 0 then
break
end
end
if num == i then
result = result .. num .. ","
end
end
return result
end
local start = os.clock()
local result = ""
-- with pcall
local bStat, bErr = pcall(
function()
result = primechecker()
end )
-- without pcall
--result = primechecker()
--print( result )
print( "well done. time:", os.clock() - start )
結果
有意な差は無い。
回 | pcall使用 | pcall未使用 |
---|---|---|
1 | 12.63 | 13.02 |
2 | 12.65 | 12.77 |
3 | 12.63 | 12.62 |