4
5

More than 5 years have passed since last update.

pcall呼び出しのパフォーマンスへの影響

Last updated at Posted at 2013-11-20

ネットで、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
4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5