ユーザー定義関数の処理速度を計測した

投稿者:    mini とりか 投稿日:2014/02/22 18:03

関数呼び出しで処理が遅くなる、まことしやかにささやかれるそんなウワサを検証検証ー

処理速度が気になったから計測したよ!たぶんすでにだれかやってるけど確認のためにもろもろ

普通にノベルゲー作るなら気にしなくていい内容かもしれないー










検証の背景と目的

Rmakeのゲームにおいてユーザー定義関数の関数を呼び出すと、直接の処理速度に比べて関数呼び出し時の処理速度が遅くなるというウワサをかなり前から聞いていた。
より便利に、より理解しやすく、より整理された処理を作る上で関数を自作し、ユーザー定義関数を利用している人は多いと思う。
特に、レスポンスの速度が求められるACTやSTGといったゲームの作成には、理想とする処理速度が得られない問題があった。

そこで、実際に関数呼び出しがどの程度の処理時間かを計算することで、どの程度処理を遅くしているのかを求めた。

関連作品

それはもういろいろ

検証概要

処理にかかる時間の計算に用いる関数

処理にかかる時間を計算するにあたり、現在時刻を取得する関数を用いる。
現在時刻を取得する関数は複数存在するが、ゲームをプレイするPCスペックによっても処理速度は異なることが判明していることから、処理にかかる時間の計算に用いる関数はプレイヤーのPCでの時刻(ミリ秒)(getLocalCurrentTimeMillisecond関数)とした。

処理時間の計算処理

本来、処理は1[ミリ秒]に満たないわずかな時間で行われている。
そこで、while文を用いて1万回の代入処理a=0を実行し、1万回の処理にかかる時間を取得するものとした。
実際に作成した3つの検証用計算処理のフローチャートを図に示す。




処理時間の計算手法

同じ計算処理は同じだけ処理時間がかかるものと仮定することで、関数呼び出しにかかる時間を計算できる。
関数呼び出しをしない場合の計算処理と同じ処理が関数呼び出しをする場合の計算処理にも含まれており、各処理時間から同じ処理部分にかかった処理時間を引くことで、処理特有の計算時間が計算できる。
今回の場合は以下の処理時間を計算し、表示する。
  • 関数呼び出し1万回の処理時間 = 関数呼び出しをする場合の処理時間 - 関数呼び出しをしない場合の処理時間
  • 関数呼び出し1回のみの処理時間 = 関数内でループ処理する場合の処理時間 - 関数呼び出しをしない場合の処理時間
また、全ての処理はシーンスクリプトに記述して行った。
計測ゲーム種別はノベルゲームで行った。

検証結果

結果


検証結果を図に示す。
関数を1万回呼び出した場合の処理時間は250~300[ミリ秒]となった。
また、関数を1回呼び出した場合の処理時間は、-4などの結果もあったことから平均して0~1[ミリ秒]の結果となった。
関数呼び出しをしない場合の計算処理から得られた、1万回繰り返したa=1、While文などの共通な計算部分の処理時間は900[ミリ秒]ほどだった。

考察

関数呼び出しには、平均してa=1の処理時間の1/3~1/2程度の処理時間が必要なことが分かった。
2月23日訂正 a=1 ic=1 ic=ic+1 if(ic<10000)の4つの処理の1/3~1/2程度の処理時間が必要
よって、関数呼び出しそのものにかかる処理時間は、さほど多くないことがわかった。
また、関数を1万回呼び出す処理よりも関数呼び出しを1回のみとし、内部で1万回処理をループさせた方が速く処理を行うことができた
したがって、関数内にWhile文でループ処理を行う方が処理速度を速くすることができる

まとめ

今回はRmakeのユーザー定義関数呼び出しの処理時間計測を行った。
関数呼び出しそのものにかかる時間はけっして長くないが、限りなく0に近いというわけではないことがわかった。
このことから、処理内容を簡略化することが理想とする処理速度に近づく手段であることがいえる。




その他雑記

1処理にかかる平均時間が1万回の処理時間から計算できるが、そうなると1回の関数呼び出しに0.03[ミリ秒]かかっていることになる。
100回の関数呼び出しにかかるのは3[ミリ秒]であることから、1つの処理しか行わない関数でも1000回関数呼び出しを行うと30[ミリ秒]を超えてしまう可能性が大きい。
35ミリ秒の処理時間を超えると基本の30FPSが確保できないため、動作がおそくなりがち。
ユーザ定義関数は細かい処理なら利用しないのも手段の1つ。

検証に使用したPCスペック

Operating System: Windows 7 Professional 64-bit (6.1, Build 7601) Service Pack 1
Processor: Intel(R) Core(TM)2 Duo CPU E8500 @ 3.16GHz (2 CPUs), ~3.2GHz
Memory: 4096MB RAM
Available OS Memory: 4094MB RAM
Page File: 5564MB used, 2623MB available

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Nyan mini rurun9(投稿日:2014/02/23 03:40, 履歴)
なるほどなるほど。
限界まで駆使するのを作るかどうかが微妙ですが、とても有意義なレポートでしたお疲れ様でしたありがとうございました
    mini とりか(投稿日:2014/02/23 11:09, 履歴)
限界まで駆使する人はいないかもだけど、無意識のうちに限界以上の処理をさせちゃうこともあるからねー、できれば避けたい意図があったりするーw