コード最適化
Compilerでの話
中間コードを以下のようなことを目的に変換する
実行効率の良いコード
所要記憶量の小さいコード
これ以前の可読性重視だったが、ここからは実行効率重視
特定のハードウェアの特性を引き
出すように変換したり
高級言語では表現できない最適化をする
例えば高級言語ではメモリ上の番地表現やレジスタの割り当てに関しては記述できない
ここで共通化できるものなどを最適化する
局所的最適化
大域的最適化
ヒープホール最適化
最適化の実践例
Goのeoncoding/binary
https://prog-lang-sys-ja.slack.com/archives/CK4DZEFFH/p1563770769000600
https://twitter.com/shumon_84/status/1152964092140724224
Rui Ueyama氏の昔のPR
https://github.com/golang/go/commit/2fbfe55e6374d212e49cff4c6723936af8e4ce89
最適化のサーベイ記事
https://juln.hatenablog.com/
部分冗長除去法
スカラ置換
http://a-kawashiro.hatenablog.com/entry/2019/07/21/185453
Lazy Code Motion
https://juln.hatenablog.com/entry/2020/12/11/161055
Reaching Definition
https://juln.hatenablog.com/entry/2021/01/13/143339
キーワード
パイプライン処理
制御フロー解析とデータフロー解析
最適化時に元のプログラムと挙動を変えてはならない
なので、最適化時に変換できる条件を満たしているかを解析によって確認する
加算や乗算では、Operandの順序が変わる最適化がある(?)
ここのオペランドに関数呼び出しが含まれていると、関数の実行と演算の順序が変わる
code:example
1 + hoge()
hoge() + 1
この関数に副作用があると、結果が異なることがある
code:example
global = 10
global + hoge() // ←このhogeの中でglobal++をしたりしたら
hoge() + global // ←こう変換すると結果が異なる
参考
『コンパイラの理論と作成技法』
『コンパイラとバーチャルマシン』
https://qiita.com/kotauchisunsun/items/84e01c6fb621fcc1a647#doubleは使うな
https://www.digitalmars.com/articles/b05.html
https://juln.hatenablog.com/entry/2020/11/19/162130