プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

プチコンの各命令の実行速度比較

プチコンの各命令の実行速度を比較してみた。
なお、プチコンの実行速度は、同じ条件を揃えたつもりでも、実行の度にかなりバラつきがある。
なので、ここに記載した数値はあくまで参考です。

10万回の単純ループを作成し、その実行にかかったフレーム数をシステム変数MAINCNTLから取り出して比較します。

'FORループ
BGN=MAINCNTL
FOR I=0 TO 100000
NEXT
? MAINCNTL-BGN

'IFループ
BGN=MAINCNTL
I=0
@IFLOOP0
I=I+1:IF I<100000 GOTO @IFLOOP0
? MAINCNTL-BGN

上記のプログラムを数回実行し、その平均をとると、

FORループ IFループ
実行フレーム数 120 300

という結果だった。
上記は100000回のループの場合なので、1回の場合にはこのおよそ100000分の1の時間と考えられる。
そこで、単位を「1命令の実行にかかるフレーム数」とする。
省略する場合は「fpi」(frame per instrunction)と書く。

単位:1命令の実行にかかるフレーム数

(1)FORループ (2)IFループ
0.00120 0.00300
'変数書き込みループ
BGN=MAINCNTL
FOR I=0 TO 100000
T=1
NEXT
? MAINCNTL-BGN
>||
'変数読み出しループ
BGN=MAINCNTL
FOR I=0 TO 100000
T=I
NEXT
? MAINCNTL-BGN

上記実行結果は、変数書き込みループが200フレーム、変数読み出しループが220フレームだった。
すると、変数書き込みに必要な純粋な実行時間は、
(変数書き込みループの実行時間 − FORループの実行時間)
と考えられるので、変数書き込み10万回の実行時間は80フレームと考えられる。
また、変数読み出しに必要な純粋な実行時間は、
(変数読み出しループの実行時間 − FORループの実行時間 − 変数書き込みの実行時間)
と考えられるので、変数読み出し10万回の実行時間は20フレームと考えられる。

1命令の実行にかかるフレーム数に直し、配列の読み出し、書き込みも加えたのが以下の表。

単位:1命令の実行にかかるフレーム数

(3)変数読み出し (4)変数書き込み (5)配列読み出し (6)配列書き込み
0.00020 0.00080 0.00060 0.00130

例えば、I=J のようなコードは、変数Jについて(3)変数読み出しを、変数Iについて(4)変数書き込みをしていると考えられるから、
およそ0.001フレームの実行時間と推定できる。
つまり1フレーム内に1000回実行できる。

考え方におかしい点等ありましたらご指摘ください。