【MSX】MSX-BASICの研究(2) PRINTとVPOKEの性能比較
- この記事について
- テスト方法
- 1文字表示編
- 比較結果
- 2×2キャラクタ表示編
- パターン4:PRINT(セミコロンなし)
- パターン5:PRINT(セミコロンあり)
- パターン6:VPOKE
- 比較結果
- 余談
- 関連記事
この記事について
MSXでキャラクタを画面表示する際には、PRINT
を使うよりはVPOKE
を使う方が速いのだが、ではどれくらい速度差があるのだろうか?
具体的に数値として知らなかったので、調べてみました。
テスト方法
今回のテスト方法は、以下の方針としています。
- WebMSXで実施。
- 一般的に使用される、SCREEN 1、WIDTH 32、DEFINT A-Zで初期化した状態で実行する。
- 文字表示を1,000回繰り返し、経過時間を測る。(
TIME
を使用)
1文字表示編
パターン1:PRINT(セミコロンなし)
プログラムリスト
10 SCREEN 1:WIDTH 32:DEFINT A-Z 20 TI=TIME 30 FOR I=0 TO 999:LOCATE 0,0:PRINT "A":NEXT 40 LOCATE 0,5:PRINT "TIME="; TIME-TI
結果
パターン2:PRINT(セミコロンあり)
プログラムリスト
10 SCREEN 1:WIDTH 32:DEFINT A-Z 20 TI=TIME 30 FOR I=0 TO 999:LOCATE 0,0:PRINT "A";:NEXT 40 LOCATE 0,5:PRINT "TIME="; TIME-TI
結果
パターン3:VPOKE
プログラムリスト
10 SCREEN 1:WIDTH 32:DEFINT A-Z 20 TI=TIME 30 FOR I=0 TO 999:VPOKE &H1800,&H41:NEXT 40 LOCATE 0,5:PRINT "TIME="; TIME-TI
結果
比較結果
パターン | 概要 | 処理時間 |
---|---|---|
1 | PRINT(セミコロンなし) | 355 |
2 | PRINT(セミコロンあり) | 305 |
3 | VPOKE | 116 |
VPOKE
がPRINT
の2倍以上速いという結果になりました。
また、PRINT
も、セミコロンをつけることで若干高速化されています。
2×2キャラクタ表示編
パターン4:PRINT(セミコロンなし)
プログラムリスト
10 SCREEN 1:WIDTH 32:DEFINT A-Z 20 TI=TIME 30 FOR I=0 TO 999:LOCATE 0,0:PRINT "マイ":LOCATE 0,1:PRINT "コン":NEXT 40 LOCATE 0,5:PRINT "TIME="; TIME-TI
結果
パターン5:PRINT(セミコロンあり)
プログラムリスト
10 SCREEN 1:WIDTH 32:DEFINT A-Z 20 TI=TIME 30 FOR I=0 TO 999:LOCATE 0,0:PRINT "マイ";:LOCATE 0,1:PRINT "コン";:NEXT 40 LOCATE 0,5:PRINT "TIME="; TIME-TI
結果
パターン6:VPOKE
プログラムリスト
10 SCREEN 1:WIDTH 32:DEFINT A-Z 20 TI=TIME 30 FOR I=0 TO 999:VPOKE&H1800,&HCF:VPOKE&H1801,&HB2:VPOKE&H1820,&HBA:VPOKE&H1821,&HDD:NEXT 40 LOCATE 0,5:PRINT "TIME="; TIME-TI
結果
比較結果
パターン | 概要 | 処理時間 |
---|---|---|
4 | PRINT(セミコロンなし) | 733 |
5 | PRINT(セミコロンあり) | 633 |
6 | VPOKE | 362 |
1文字表示の時と比べての処理時間は、PRINT
は約2倍強ですが、VPOKE
は約3倍強ほどになっています。
これは、プログラムリストの通り、キャラクタの数だけVPOKE
する(=4回実行する)必要があるためですが、それを差し引いても、PRINT
よりは速いですね。
通常、ゲームで表示するパターンは2×2キャラクタ(16×16ドット)が多いと思われるため、なるべくVPOKE
を使うことで高速化が見込めると思います。
余談
なお、VPOKE
する値を10進数で書いて計測もしてみたのでが、16進数の時とほとんど変わりませんでした。
MSXのBASICプログラムでは、16進数、10進数のどちらで書いても良いと思います。
※2021/8/11追記: エスケープシーケンスで、1回のPRINT文で2×2キャラクタを表示した場合の処理速度を計測してみました。
パターン7:PRINT(エスケープシーケンス使用)
プログラムリスト
10 SCREEN 1:WIDTH 32 20 TI=TIME 30 FOR I=0 TO 999:LOCATE 0,0:PRINT "マイ"+CHR$(29)+CHR$(29)+CHR$(31)+"コン";:NEXT 40 LOCATE 0,5:PRINT "TIME="; TIME-TI
CHR$(29)がカーソル左移動、CHR$(31)がカーソル下移動になります。
処理結果
結果、961とPRINT2回より遅いという結果になりました。
MZとかだと速かった気がしたんですけど、MSXだと結構遅かったのですね…。