自動最適化と手動最適化
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/10/21 23:57 UTC 版)
「最適化 (情報工学)」の記事における「自動最適化と手動最適化」の解説
最適化はコンパイラで自動的に行うこともできるし、プログラマが自ら行うこともできる。局所的な最適化の効果は限定的であり、大域的な最適化の方が効果が大きい。一般に、より優れたアルゴリズムやデータ構造を見出すことが最も強力な最適化となる。一方、組込み用途のようにアクセス先がI/Oアドレスにマッピングされている場合、最適化の結果としてアクセス順序が入替えられると組込み機器としては問題が発生する可能性がある。そのような場合、volatile キーワードを付与することで、アクセス順序の入替を抑制することが可能である。 システム全体の最適化は自動化するには複雑すぎるため、人間の手で行うことが多い。その場合、プログラマやシステム管理者が自らコードを修正し、性能を改善する。効率が改善されるとしても、自動最適化に比べれば遥かにコストを要する作業である。 第一にリソースを最も多く消費している箇所(ボトルネック)を見つけるため、プロファイラを利用することが何よりも重要である。プログラマはボトルネックがどこか正確に把握していると思っているものだが、そのような予測は間違っていることが多々ある。重要でないコードの最適化は全体性能に与える効果が少ない。 ボトルネックを特定したら、まずそのプログラムで使われているアルゴリズムを再考するところから最適化が始まる。通常、汎用的アルゴリズムよりも特定の問題に特化したアルゴリズムの方が調整しやすい。例えば、大きなリストをソートする処理では、効率のよい汎用アルゴリズムの1つであるクイックソートを使うのが一般的である。しかし、ソート対象の性質が判っていれば(例えば事前に何らかの順番で並んでいるなど)、その他のアルゴリズムや特製のソートルーチンの方が有効な場合もある。 最善のアルゴリズムが選択されていると判明した場合、コードの最適化が開始される。ループ展開をしたり、なるべく小さいデータ型を使うようにしたり(浮動小数点でなくてもよい計算を整数の計算に直すなど)する。 性能ボトルネックがアルゴリズムの問題やデータ構造の問題ではなく、言語の制限による場合もある。このため、プログラムの重要な部分を異なるプログラミング言語で書き換え、よりマシンに近いアクセスを行う場合がある。例えば、Pythonなどの高級言語でC言語のモジュールを使用して高速化したりする。C言語で書かれたプログラムなら、一部をアセンブリ言語で置換する。D言語などはインラインアセンブラ機能が利用できる。 パレートの法則によれば、書き換えはプログラムのごく一部だけで済む。従って、最適化にかかるコストと全体の性能向上が十分見合う結果となる。 手動の最適化は可読性を損なうことが多い。最適化にあたっては、その文書化と将来の開発への影響の評価が重要である。 自動最適化を行うプログラムをオプティマイザ (optimizer) と呼ぶ。オプティマイザはコンパイラに内蔵されていることが多く、コンパイル中に最適化が行われる。オプティマイザは生成されたコードを特定のプロセッサ向けに最適化することが多い。従って自動最適化はコンパイラ最適化とほぼ同義である。 一部の高級言語(EiffelやEsterel)は中間言語を使ってプログラムを最適化する。 グリッド・コンピューティングや分散コンピューティングでは、稼働率の高いコンピュータから別の稼働率の低いコンピュータにタスクを移すことでシステム全体の最適化を行う。
※この「自動最適化と手動最適化」の解説は、「最適化 (情報工学)」の解説の一部です。
「自動最適化と手動最適化」を含む「最適化 (情報工学)」の記事については、「最適化 (情報工学)」の概要を参照ください。
- 自動最適化と手動最適化のページへのリンク