コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
ジプッチャ ◆tkYhkmSxSAam
2019/5/11 18:09
New3DSで1000000回変数Iを変えるループを実行させてみたところ、
実行にかかった時間(ミリ秒単位)は
GOTO文:675
REPEAT文:623
FOR文:687
WHILE文:665 でした。(それぞれ10回の平均)
REPEATだけだいぶ速いのはなんでなんだろう。
知ってる方いましたら教えてください。

コメント

アバター
Soybeanman 2019/5/11 20:57 ◆SDLkyXUP6WqK
これは個人的な考えで確証はありませんが、
WHILEの場合はIFの時のように条件式の結果がTRUEの場合に下の文を実行するのですが、これはループ文ではないコードの進み方のときのように一行終わったら下の文へと進むというような動きと同じです。
なのでTRUEの場合はWHILE側で特別な処理をする必要はなくなります。
逆にFALSEの場合はWENDに飛ぶ必要があるので特別な処理があるということになります。
つまり、何が言いたいのかと言うと「TRUEの場合に特別な処理を行う」と言うように内部のコンパイラが式を変形するのであれば、WHILEやIF(ELSEが無いとき)の場合には条件式の最初に論理反転の処理を付け足すことになるようになっているのかなと思いました。
それの検証方法を思いついたので書いておきます。
FOR I=1 TO 1000000
 IF FLASE THEN
 ENDIF
NEXT

FOR I=1 TO 1000000
 WHILE FLASE
 WEND
NEXT
まず、上記の二つの式の実行時間がほとんど同じであるかどうかを確認して、
FOR I=1 TO 1000000
 WHILE FLASE
 WEND
NEXT

FOR I=1 TO 1000000
 REPEAT
 UNTIL TRUE
NEXT
の上記二つの実行時間を比べて見てREPERTの方が早ければ多分そういうことなんだろうなと思います。
暇があれば試してみようと思います。

追記:試してみました。
以下に書くのは10回試してその実行時間の平均(ミリ秒)です。
IFの場合1120
WHILEの場合1124.8
REPEATの場合1119
IFとWHILEの実行時間の差が大きいので多分違いますね…残念です。
アバター
ジプッチャ 2019/5/11 21:04 ◆tkYhkmSxSAam
Soybeanmanさん≫
おお…なるほど!
多分そうだと思います。
丁寧な解説ありがとうございます!
アバター
おちゃめ 2019/5/11 21:30 ◆jH1opV6FnGyx
REPEAT〜UNTILが速い理由はプチコン3号ではそういう仕様になっているということでしょうね。
ちなみにポケコン(PC-E650)ではREPEAT〜UNTILよりFOR〜NEXTの方が高速であり、速度は内部処理方法に依存していると思います。

では、最速がREPEAT〜UNTILかというとそうではなく実はGOTOなのです。

I=-1E6
@A
I=I+1
ON I GOTO @B
GOTO @A
@B

これを実行するとIを100万回インクリメントする処理が平均597ミリ秒で行えるためREPEAT〜UNTILよりも高速です。
アバター
ジプッチャ 2019/5/11 21:34 ◆tkYhkmSxSAam
おちゃめさん≫
お…おお!
知りませんでした。ありがとうございます!

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -