新城@筑波大学情報です。こんにちは。

In article <dc95c98e.0310230706.77f7877a@posting.google.com>
        kiwi@s05.itscom.net (Kiwi) writes:
> よく、「インライン展開を行うと、プログラム領域が膨らむが実行速度が上がる」
> と聞きますが、プログラム領域が膨らむことによって命令キャッシュのヒット率が
> 下がって実行速度も下がる、ということは無いのでしょうか?

「あるかないか?」と問われると、もちろん答えは「ある」です。

インライン展開した方が得かしない方が得か、なにか予測できるん
ですかね。全部のコードが一様に実行されるということなら、まあ
なんとかなりそうな気もしますけど。コードの実行回数の予測が難
しいですよね。

キャッシュのラインがぶつかるという話もあるので、あえてコード
を大きくした方が、全体的には得という話もあるんでしょうね。

実際にインライン展開をオンにしたりオフにしたりして走らせてみ
て実行時間を図ってみたことはあるんですが、CPU とかレジスタ数
とかによっても違うでしょうし。前に試したのは、SPARC のレジス
タ・ウインドウの効果を調べるというものです。答えはローカル変
数がウインドウに入るくらいの展開した方がいいということだった
と思いました。レジスタ・ウインドウがあると手続き呼出しが苦に
はならないはずなんだけれど、割込みがあったりスレッドのコンテ
キスト切替えがなどの外乱があると、フラッシュされるし。

> なお、インライン展開してもプログラム領域が小さく場合があることは知っています。

インライン展開どころか、if 文とか関数呼出しを「増」やした方
が速いということもあるから、困るんですよね。一生懸命、新しい
方式を考えて10%速くしたつもりが、この手の変動に阻まれてう
まく効果が図れないということがあります。

元の記事は、fj.comp.lang.c++ に投稿されたもですが、C++言語と
は独立した話も多いので、 Followup-To: fj.comp.arch としてお
きます。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\