同じ命令なのに、なぜ遅くなる?(関数の置き場所ラボ)

関数が「メモリのどこに置かれたか」だけで、プログラムの速さが変わることがあります。 どうぶつしょうぎ完全解析RTA の記録 #32 で、実行する命令がまったく同じ処理が 0.63 秒遅くなりました。 その仕組みと、記録 #33 でそれをどう止めるかを、動くメモリの帯で説明する図解を作りました。

図解を開く → 関数の置き場所ラボ

下の帯は、図解と同じものです。つまみを動かすと、前の関数が伸びたときに後ろの関数がずれ、何億回も回るループが CPU の読み込みの区切り(64バイト)をまたぐ様子が見られます。

showBoardnextBoardInvNormalループhugeAllocbuildSuccRangeループ064128192256320384448512
手を作る関数 nextBoardInvNormal置き場所の番地 0x1046ループ1周で読むかたまり 1 個
後退解析の関数 buildSuccRange置き場所の番地 0x10feループ1周で読むかたまり 1 個