IchigoJam速度比較 ～IchigoJam Rが10倍速いってマジ？～

最近、[こどもパソコン IchigoJam](https://ichigojam.net/) の新機種 IchigoJam R が発表されました。

[IchigoJam R ＆ IchigoSand 発表、HHKB他USBキーボード対応するRISC-V版、Zen言語でかんたんマシン語両対応 zen4ij #IchigoJam #riscv #zen / 福野泰介の一日一創 / Create every day by Taisuke Fukuno](https://fukuno.jig.jp/3077)

> なんとインタプリター、10倍速！

とのことですが、果たして本当でしょうか？
手元の他の機種とともに、調べてみました。

※IchigoJamはjig.jpの登録商標です。

# 使用した機種

|機種名|ファームウェア|VER()|
|---|---|---|
|IchigoJam U|1.0.0|10017|
|IchigoJam S|1.3.1|13106|
|IchigoKamuy|1.4.1|14114|
|IchigoJam R|1.5b|15001|

# ベンチマーク

今回は、4種類のプログラムを用意しました。
時間の測定には、`TICK()`関数を用います。
この関数は、1秒あたり60進む時刻を返します。
また、ビデオ出力有(`VIDEO 1`)と無(`VIDEO 0`)の差も比較します。

「相対速度」は、IchigoKamuyのビデオ出力有の実行時間を基準(1.0000)とし、
「基準の実行時間÷各項目の実行時間」とします。

## フィボナッチ数列の計算

### 処理内容

フィボナッチ数列の32765番目の値を求めます。
ただし、0番目を0、1番目を1とし、下4桁のみを求めます。

### ソースコード

```
10 ' 32765th ﾌｨﾎﾞﾅｯﾁ ｽｳﾚﾂ
20 P=0:C=1:CLT
30 FOR I=2 TO 32765
40 N=P+C:P=C:C=N
50 IF C>9999 C=C-10000
60 NEXT
70 ?"RES=";C;",TIME=";TICK()
```

### 測定結果

|機種名|実行時間<br>(ビデオ出力有)|実行時間<br>(ビデオ出力無)|相対速度<br>(ビデオ出力有)|相対速度<br>(ビデオ出力無)|
|---|---|---|---|---|
|IchigoJam U|32135|11787|0.3118|0.8500|
|IchigoJam S|10107|5359|0.9913|1.8696|
|IchigoKamuy|10019|6575|1.0000|1.5238|
|IchigoJam R|1215|1067|8.2461|9.3899|

## 素数の和の計算

### 処理内容

5000以下の素数の和を求めます。

### ソースコード

```
10 ' 5000 ﾏﾃﾞ ﾉ ｿｽｳ ﾉ ﾜ
20 CLT
30 S=0:T=0
40 FOR I=2 TO 5000
50 J=2
60 IF J*J>I GOTO 90
70 IF I%J=0 GOTO 110
80 J=J+1:GOTO 60
90 S=S+I
100 IF S>9999 S=S-10000:T=T+1
110 NEXT
120 E=TICK():?"SUM=";T;
130 IF S<1000 ?"0";
140 IF S<100 ?"0";
150 IF S<10 ?"0";
160 ?S;",TIME=";E
```

### 測定結果

|機種名|実行時間<br>(ビデオ出力有)|実行時間<br>(ビデオ出力無)|相対速度<br>(ビデオ出力有)|相対速度<br>(ビデオ出力無)|
|---|---|---|---|---|
|IchigoJam U|29767|10918|0.3402|0.9276|
|IchigoJam S|10227|5422|0.9902|1.8678|
|IchigoKamuy|10127|6646|1.0000|1.5238|
|IchigoJam R|1228|1078|9.2467|9.3942|

## Xorshift (疑似乱数)


### 処理内容

[Xorshift](https://ja.wikipedia.org/wiki/Xorshift)を用いて擬似乱数列を生成します。
[前の記事](https://qiita.com/mikecat_mixc/items/e674b6d21f9df4c9f730)のコードをベースに、求める回数を10倍にしました。

### ソースコード

```
10 'Xorshift ﾋｶｸ 2
20 POKE#700,183,47,25,224,151,6,0,0,147,134,198,15,136,66,147,21,181,0,45,141,204,66,140,194,140,70,204,194,204,70,140,198,19,214,53,1,177,141,19,86,133,0,45,141,49,141,200,198,161,101,253,21,109,141
30 POKE#736,130,128,49,163,24,104,193,2,72,64,89,104,25,96,153,104,89,96,217,104,153,96,202,12,81,64,2,10,72,64,80,64,216,96,127,33,9,2,255,49,8,64,112,71
40 CLT
50 FOR I=1 TO 10000
60 '
70 NEXT
80 E=TICK()
90 ?"ｸｳﾃﾝ :";E
100 POKE#800,#15,#CD,#5B,#07,#E5,#55,#9A,#15
110 POKE#808,#B5,#3B,#12,#1F,#33,#13,#49,#05
120 CLT
130 FOR I=1 TO 10000
140 X=USR(#700,0)
150 NEXT
160 E=TICK()
170 ?"ﾏｼﾝｺﾞ:";E;",X=";X
180 LET[0],#CD15,#075B,#55E5,#159A,#3BB5,#1F12,#1333,#0549
190 CLT
200 FOR I=1 TO 10000
210 T=[0]^([0]<<11):U=[1]^([1]<<11|[0]>>5&#7FF):[0]=[2]:[1]=[3]:[2]=[4]:[3]=[5]:[4]=[6]:[5]=[7]:V=[6]^([7]>>3&#1FFF)^T^(U<<8|T>>8&#FF):W=[7]^U^(U>>8&#FF):[6]=V:[7]=W:X=V&#7FFF
220 NEXT
230 E=TICK()
240 ?"BASIC:";E;",X=";X
```

### 測定結果

ビデオ出力有での実行時間

|機種名|空転|マシン語|BASIC|マシン語-空転|BASIC-空転|
|---|---|---|---|---|---|
|IchigoJam U|1537|2789|14654|1252|13117|
|IchigoJam S|781|1629|9742|848|8961|
|IchigoKamuy|771|1603|9442|832|8671|
|IchigoJam R|93|194|1123|101|1030|

ビデオ出力無での実行時間

|機種名|空転|マシン語|BASIC|マシン語-空転|BASIC-空転|
|---|---|---|---|---|---|
|IchigoJam U|563|1023|5375|460|4812|
|IchigoJam S|414|863|5165|449|4751|
|IchigoKamuy|506|1052|6196|546|5690|
|IchigoJam R|81|171|985|90|904|

ビデオ出力有での相対速度

|機種名|空転|マシン語|BASIC|マシン語-空転|BASIC-空転|
|---|---|---|---|---|---|
|IchigoJam U|0.5016|0.5748|0.6443|0.6645|0.6611|
|IchigoJam S|0.9872|0.9840|0.9692|0.9811|0.9676|
|IchigoKamuy|1.0000|1.0000|1.0000|1.0000|1.0000|
|IchigoJam R|8.2903|8.2629|8.4078|8.2376|8.4184|

ビデオ出力無での相対速度

|機種名|空転|マシン語|BASIC|マシン語-空転|BASIC-空転|
|---|---|---|---|---|---|
|IchigoJam U|1.3694|1.5670|1.7567|1.8087|1.8020|
|IchigoJam S|1.8623|1.8575|1.8281|1.8530|1.8251|
|IchigoKamuy|1.5237|1.5238|1.5239|1.5155|1.5239|
|IchigoJam R|9.5185|9.3743|9.5858|9.2444|9.5918|

## 宇宙旅行

### 処理内容

星々の間を飛行していきます。
相対的に星々がこちらに向かってくるように見えます。
左上に、1フレームを描画するのにかかった時間(`TICK()`の差分)を表示します。

### ソースコード

```
10 ' ﾎｼ
20 N=30:CLS:T=TICK()
30 FOR I=0 TO N-1
40 [I*3]=RND(2049)-1024:[I*3+1]=RND(2049)-1024:[I*3+2]=500+RND(501)
50 NEXT
60 FOR I=0 TO N-1
70 X=[I*3]*10/[I*3+2]+32:Y=[I*3+1]*10/[I*3+2]+24:D=0:GOSUB 160
80 [I*3+2]=[I*3+2]-50
90 IF [I*3+2]>0 GOTO 110
100 [I*3]=RND(2049)-1024:[I*3+1]=RND(2049)-1024:[I*3+2]=500+RND(501)
110 X=[I*3]*10/[I*3+2]+32:Y=[I*3+1]*10/[I*3+2]+24:D=1:GOSUB 160
120 NEXT
130 U=TICK():F=U-T:IF F<0 F=F+32000+768
140 T=U:LOCATE 0,0:?"    ";:LOCATE (F<10000)+(F<1000)+(F<100)+(F<10),0:?F;
150 GOTO 60
160 IF X<0 OR X>63 OR Y<0 OR Y>47 RETURN
170 A=#900+Y>>1<<5+X>>1:M=1<<(Y&1*2+X&1):C=PEEK(A):IF D C=C|M ELSE C=C&~M
180 IF A>#905 POKE A,C|#80
190 RETURN
```

### 測定結果

最初の10フレームの描画時間の合計を示します。

|機種名|実行時間<br>(ビデオ出力有)|実行時間<br>(ビデオ出力無)|相対速度<br>(ビデオ出力有)|相対速度<br>(ビデオ出力無)|
|---|---|---|---|---|
|IchigoJam U|1627|600|0.3534|0.9583|
|IchigoJam S|588|315|0.9779|1.8254|
|IchigoKamuy|575|379|1.0000|1.5172|
|IchigoJam R|72|63|7.9861|9.1270|

また、以下はそれぞれの機種での実行の様子を並べたYouTube動画(1:17)です。
[![IchigoJamで宇宙旅行 速度比較](http://img.youtube.com/vi/aOP7Hyn3FvA/maxresdefault.jpg)](https://www.youtube.com/watch?v=aOP7Hyn3FvA)

# 結論

今回の実験ではIchigoKamuy (IchigoJam 1.4.1)と比べて「10倍速」を達成することはできませんでしたが、
ビデオ出力有で8.2倍程度速くなっていることが確認できました。
また、IchigoKamuyでは`VIDEO 0` (ビデオ出力オフ) により1.52倍程度速くなりましたが、
IchigoJam Rでは`VIDEO 0`による高速化は1.14倍程度にとどまりました。
DMAのおかげかはわかりませんが、IchigoJam Rではビデオ出力のコストがこれまでより少なくなっていることがわかります。