同じ命令なのに、なぜ遅くなる?(関数の置き場所ラボ)
関数が「メモリのどこに置かれたか」だけで、プログラムの速さが変わることがあります。 どうぶつしょうぎ完全解析RTA の記録 #32 で、実行する命令がまったく同じ処理が 0.63 秒遅くなりました。 その仕組みと、記録 #33 でそれをどう止めるかを、動くメモリの帯で説明する図解を作りました。
下の帯は、図解と同じものです。つまみを動かすと、前の関数が伸びたときに後ろの関数がずれ、何億回も回るループが CPU の読み込みの区切り(64バイト)をまたぐ様子が見られます。
手を作る関数
nextBoardInvNormal置き場所の番地 0x1046ループ1周で読むかたまり 1 個後退解析の関数
buildSuccRange置き場所の番地 0x10feループ1周で読むかたまり 1 個