Tonyuの処理速度について
測定環境
OS : WindowsXP Tonyuのバージョン : 1.21 CPU : Athron64 3400+ 800MHz(2.4GHzをクロックダウン) グラフィックカード : 高性能
オブジェクトの実行負荷
オブジェクトを生成した場合の実行負荷
(オブジェクトの実行に要する時間をSpriteの値を基底に正規化したもの)
(値の大きいものほど負荷が高い)
(オブジェクトの実行に要する時間をSpriteの値を基底に正規化したもの)
(値の大きいものほど負荷が高い)
オブジェクト | 負荷 |
Sprite | 1.0 |
Dx_基本 | 1.8 |
Dx_ScaleX=2 | 3.3 |
Dx_半透明 | 2.8 |
Text_半角 | 4.4 |
Text_全角 | 3.1 |
Panel_50*50 | 2.8 |
Panel_100*100 | 5.9 |
Panel_200*200 | 13.3 |
Secret | 0.5 |
<負荷の算出式>
負荷 = 1 / ( [そのオブジェクトのFPS] / ["Sprite"のFPS] )
但し、FPSは"Sprite"のFPSが60以下になるよう、オブジェクト数を増やして測定している
- 各々”Char”を省略している
- TextCharの項目分けは、表示するテキストの種類
(左から、テキスト無し、半角英数字1文字、同2文字、全角1文字)
- PanelCharの項目分けは、パネルのサイズ
memo
- 表示されるオブジェクトは、その大きさに比して負荷が重くなる
- オブジェクトが画面内に表示されていない場合、負荷は軽くなる
(ex.alpha=0、座標が画面外、などの場合)
- 測定環境により、値は大きく変わる可能性がある(未確認)
命令の処理時間
命令の実行にかかる負荷。
(命令の実行に要する時間を演算命令の値を基底に正規化したもの)
(命令の実行に要する時間を演算命令の値を基底に正規化したもの)
命令 | 負荷 |
for | 2.1 |
while | 2.1 |
if | 0.8 |
演算命令 | 1.0 |
a=a+b; | 1.5 |
a++; | 1.0 |
a+b (文字列結合) | 9.0 |
a; | 0.5 |
関数呼び出し | 1.3 |
print("@") | 881.3 |
drawText("@") | 62.8 |
drawText("@") | 49.7 |
drawLine_長さ10 | 10.4 |
drawLine_長さ100 | 10.8 |
fillRect_50×50 | 13.4 |
fillRect_100×100 | 16.9 |
fillRect_200×200 | 36.8 |
$panel.drawText("@") | 199.0 |
$panel.fillRect_100×100 | 83.9 |
Array.get() | 2.5 |
Array.set(1) | 2.9 |
Array.set("@") | 21.7 |
str.split() | 30555.5 |
copyRect_50×50 | 40.5 |
copyRect_100×100 | 129.6 |
copyRect_200×200 | 494.8 |
fw.writeLn("@") | 57.9 |
fr.readLn() | 46.3 |
valueOf("1") | 61.1 |
valueOf("1.0") | 12.9 |
"@"は全角
"@"は半角
演算命令には、”算術演算”、”論理演算”、”代入”が含まれる。
算術演算の例 : a+b;
論理演算の例 : a&&b;
代入の例 : a=b;
"@"は半角
演算命令には、”算術演算”、”論理演算”、”代入”が含まれる。
算術演算の例 : a+b;
論理演算の例 : a&&b;
代入の例 : a=b;
<負荷の算出式>
負荷 = [ その命令の実行時間 ] / [ "演算命令"の実行時間 ]
memo
- 実際にかかる時間が知りたい場合は、演算命令の実行時間を測定し、表の値にそれを掛ければよい
- split()は異常に重い(演算命令の実に3万倍!)。使用時は注意されたし。
FPS算出式(暫定)
FPS = 1/([命令の実行時間の合計]*10+[オブジェクトの実行時間の合計])
(時間の単位は秒)
(命令の実行時間は、描画系命令のみに影響される様に感じる。
つまり、演算系命令の実行時間は関係ないのでは?)
(命令の実行時間は、描画系命令のみに影響される様に感じる。
つまり、演算系命令の実行時間は関係ないのでは?)
[実行時間の合計]は、"命令の実行時間"の項目で解説済み。
[オブジェクトの処理時間]は、while()ループのみを行うオブジェクトを生成し、そのときのFPSを測定、そしてその逆数を取ることで求められる。
但し、FPSは60以上にはならないので、60以下になる数のオブジェクトを生成し実行時間を求め、その時間をオブジェクトの数で割る必要がある。 "Sprite"の値さえ求めれば、"オブジェクトの実行負荷"の表の値に掛ける事で、他のオブジェクトの実行時間も求められる。
[オブジェクトの処理時間]は、while()ループのみを行うオブジェクトを生成し、そのときのFPSを測定、そしてその逆数を取ることで求められる。
但し、FPSは60以上にはならないので、60以下になる数のオブジェクトを生成し実行時間を求め、その時間をオブジェクトの数で割る必要がある。 "Sprite"の値さえ求めれば、"オブジェクトの実行負荷"の表の値に掛ける事で、他のオブジェクトの実行時間も求められる。
フツーに考えれば、*10は必要ないはずだが、これが無いと結果が合わない。何故?