aburi6800のブログ

コンピュータのプログラミング、ゲームに関するニッチな情報を書いていくブログです。

【MSX】MSX-BASICの研究(2) PRINTと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

結果

f:id:aburi6800:20210811013101p:plain
パターン1の実行結果

パターン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

結果

f:id:aburi6800:20210811013357p:plain
パターン2の実行結果

パターン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

結果

f:id:aburi6800:20210811013510p:plain
パターン3の実行結果

比較結果

パターン 概要 処理時間
1 PRINT(セミコロンなし) 355
2 PRINT(セミコロンあり) 305
3 VPOKE 116

VPOKEPRINTの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

結果

f:id:aburi6800:20210811013748p:plain
パターン4の実行結果

パターン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

結果

f:id:aburi6800:20210811013907p:plain
パターン5の実行結果

パターン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

結果

f:id:aburi6800:20210811014019p:plain
パターン6の実行結果

比較結果

パターン 概要 処理時間
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)がカーソル下移動になります。

処理結果

f:id:aburi6800:20210811091619p:plain
パターン7の処理結果

結果、961とPRINT2回より遅いという結果になりました。
MZとかだと速かった気がしたんですけど、MSXだと結構遅かったのですね…。


関連記事

【MSX】MSX-BASICの研究(1) 条件分岐ロジック - aburi6800のブログ