inliningとは、前回の記事でも紹介したインライン化をより積極的に行うようになる機能のことである。前回の記事からの引用だが、Goのコンパイラは、関数が以下の条件に当てはまるとき、関数を直接、呼び出し元に展開する最適化を行っている。(これも上のコマンドで解析結果を確認できる)コードが80ノード以下(Go1.4以前は40ノード)関数呼び出し、ループ、ラベル、クロージャ、panic、recover、select、switchなどの複雑な構文を含まない以上がインライン化の大まかな条件であった。ここには、関数の呼び出しという項目があり、今まで関数のインライン化は一番末端にある関数(木構造でいう葉っぱ)でしかインライン化を行なっていなかった。inliningは、これを改良し末端以外の関数でもインライン化を行うための最適化である。inliningの有効無効に関わらない話だが、インライン化により、スタックトレースを出力した際などに実際のソースコードとの差異が出てしまう。以下のような関数があったとする。b((nil)(*s))}このコードがもしインライン化されたとすれば、以下のようなコードになる。dereferenceが発生した場合、以下のようなスタックトレースが表示されてしまう。bの情報が消えており、デバッグが困難になってしまう。inliningでは、インライン化した関数のPCとソースコード上の位置を保持する木構造をテーブルとして表した構造体(InlTree)を生成し、シンボルテーブルに格納する。実行時は格納されたテーブルから実際のスタックトレースを生成し表示を行うことで、インライン化をしたとしても正しく出力が行えるようになる。制限として、以下のように引数は省略されてしまう。+0x2どのぐらい早くなるの?ベンチマークによると9%ほどパフォーマンスが改善するらしい。inliningの恩恵を受けることのできる部分があるため、以下のような改善を繰り返していくことでGo全体のパフォーマンスが向上するのではと思う。最近、面白いツイートを見つけた。I...2018-09-30Golangのメモリ周りのメモ以前、このレポジトリがバズっていた。bazelはビル...2017-01-28オブジェクト指向とは新人プログラマに知っておいてもらいたい人類がオブジェクト指...2015-10-23HSPにおいてモジュール内部でbuttonを配置して分岐先でthismodを参照するよくわからないタイトルになってしまった。<p>wait0000さんは、はてなブログを使っています。<p>引用をストックできませんでした。<p>限定公開記事のため引用できません。