IchigoJam(Rではない)の除算は遅いか？

# 検証内容

IchigoJam R で使われているGD32VF103CBT6には除算命令があるが、
IchigoJam で使われているLPC1114FN28/102やLPC1114FDH28には除算命令が無い。
ということは、RではないIchigoJamでの除算はソフトウェアで計算しなければならず、遅いか？

※「RではないIchigoJam」にはIchigoJam PC、IchigoJam ap、IchigoJam RPi、IchigoJam webもあるが、ここでは扱わない

# 検証方法

IchigoKamuy (1.4.1、`VER()=14114`) および IchigoJam R (1.5b、`VER()=15001`) において、
ビデオ出力をオフ(`VIDEO0`)にし、以下のプログラムで各演算子の計算にかかる時間を調べた。

```
10 ' ｴﾝｻﾞﾝｼ ｿｸﾄﾞ ﾃｽﾄ
20 INPUT"B=",B
30 INPUT"C=",C
40 CLT:FORI=1TO30000:A=B*C:NEXT:T=TICK():?"*",T
50 CLT:FORI=1TO30000:A=B/C:NEXT:T=TICK():?"/",T
60 CLT:FORI=1TO30000:A=B%C:NEXT:T=TICK():?"%",T
70 CLT:FORI=1TO30000:A=BMODC:NEXT:T=TICK():?"MOD",T
80 CLT:FORI=1TO30000:A=B<<C:NEXT:T=TICK():?"<<",T
90 CLT:FORI=1TO30000:A=B>>C:NEXT:T=TICK():?">>",T
100 CLT:FORI=1TO30000:A=B&C:NEXT:T=TICK():?"&",T
110 CLT:FORI=1TO30000:A=B^C:NEXT:T=TICK():?"^",T
120 CLT:FORI=1TO30000:A=B+C:NEXT:T=TICK():?"+",T
130 CLT:FORI=1TO30000:A=B-C:NEXT:T=TICK():?"-",T
140 CLT:FORI=1TO30000:A=B|C:NEXT:T=TICK():?"|",T
150 CLT:FORI=1TO30000:A=B=C:NEXT:T=TICK():?"=",T
160 CLT:FORI=1TO30000:A=B!=C:NEXT:T=TICK():?"!=",T
160 CLT:FORI=1TO30000:A=B<>C:NEXT:T=TICK():?"<>",T
170 CLT:FORI=1TO30000:A=B<C:NEXT:T=TICK():?"<",T
180 CLT:FORI=1TO30000:A=B>C:NEXT:T=TICK():?">",T
190 CLT:FORI=1TO30000:A=B<=C:NEXT:T=TICK():?"<=",T
200 CLT:FORI=1TO30000:A=B>=C:NEXT:T=TICK():?">=",T
210 CLT:FORI=1TO30000:A=BANDC:NEXT:T=TICK():?"AND",T
220 CLT:FORI=1TO30000:A=BORC:NEXT:T=TICK():?"OR",T
```

# 実験結果

それぞれの環境において1回測定した結果、実行時間(`TICK()`の値)は以下のようになった。

|演算子|IchigoKamuy<br>`B=8765:C=4321`|IchigoKamuy<br>`B=30000:C=2`|IchigoJam R<br>`B=8765:C=4321`|IchigoJam R<br>`B=30000:C=2`|
|---|---|---|---|---|
|*|2556|2557|414|414|
|/|2565|2577|416|416|
|%|2569|2582|416|416|
|MOD|2576|2588|417|417|
|&lt;&lt;|2555|2556|414|414|
|&gt;&gt;|2552|2552|414|414|
|&amp;|2545|2544|412|412|
|^|2547|2547|413|413|
|+|2578|2579|418|417|
|-|2582|2582|418|419|
|&#124;|2588|2587|419|419|
|=|2605|2605|421|421|
|&lt;&gt;|2614|2615|423|423|
|&lt;|2627|2626|424|424|
|&gt;|2632|2632|426|426|
|&lt;=|2623|2623|424|424|
|&gt;=|2629|2629|425|425|
|AND|2643|2643|427|427|
|OR|2655|2656|428|428|

また、以下のプログラムを用いて演算子の計算以外の部分にかかる時間を1回測定した。

```
CLT:FORI=1TO30000:A=B:NEXT:T=TICK():?T
```

その結果、`TICK()`の値はIchigoKamuyでは2297、IchigoJam R では370となった。
この値を引き、演算子の計算のみの時間に近づけた実行時間は、以下のようになった。

|演算子|IchigoKamuy<br>`B=8765:C=4321`|IchigoKamuy<br>`B=30000:C=2`|IchigoJam R<br>`B=8765:C=4321`|IchigoJam R<br>`B=30000:C=2`|
|---|---|---|---|---|
|*|259|260|44|44|
|/|268|280|46|46|
|%|272|285|46|46|
|MOD|279|291|47|47|
|&lt;&lt;|258|259|44|44|
|&gt;&gt;|255|255|44|44|
|&amp;|248|247|42|42|
|^|250|250|43|43|
|+|281|282|48|47|
|-|285|285|48|49|
|&#124;|291|290|49|49|
|=|308|308|51|51|
|&lt;&gt;|317|318|53|53|
|&lt;|330|329|54|54|
|&gt;|335|335|56|56|
|&lt;=|326|326|54|54|
|&gt;=|332|332|55|55|
|AND|346|346|57|57|
|OR|358|359|58|58|

今回実験を行った2種類の入力値について、ほとんどの演算子で実行時間の差は1以下であるが、
IchigoKamuyにおける`/`、`%`、`MOD`演算子では実行時間の差が12～13と大きくなっている。
これは、IchigoKamuyにおいては除算をソフトウェアで実行しており、
そのアルゴリズムの完了までの時間が入力値によって変わるためであると考えられる。

一方、IchigoJam Rでは、除算の演算子でも今回の2種類の入力値においては実行時間の差が出ていない。
これは、実行時間が入力値の影響を受けないハードウェアで除算が実行されているためであると予想できる。

なお、実行時間が入力値によって変わるものの、
予想に反し、RではないIchigoJamにおいても除算は遅くないことがわかった。
除算にかかった時間は加算や減算と同程度であり、比較の方がかかる時間が長いという結果になった。

# 結論

RではないIchigoJamにおいては除算にかかる時間は入力値によって変わることがあるが、
IchigoJam R においては除算にかかる時間が入力値によって変わらないと予想できる。

除算命令が無いCPUを用いているRではないIchigoJamにおいても、
除算演算子の処理は他の演算子と比べて特別遅いわけではなく、除算より処理時間が長い演算子も多い。

# おわりに

* IchigoJamはjig.jpの登録商標です。
* IchigoKamuyは株式会社syushuの登録商標です。