最適化をローカルに保ち、明確にし、文書化し、ソースコードとランタイムパフォーマンスの両方の観点から、最適化されたバージョンを相互に、および最適化されていないバージョンと簡単に比較します。
完全な答え
そのような最適化が本当に場合はある製品への重要な、あなたは最適化の前に有用であっただけでなく、なぜ知っているが、また、彼らが将来的に有用であろうかどうかを知る助け開発者に十分な情報を提供する必要があります。
理想的には、ビルドプロセスにパフォーマンステストを組み込む必要があります。そのため、新しいテクノロジーが古い最適化を無効にする時期を見つけます。
覚えておいてください:
プログラムの最適化の最初のルール:しないでください。
プログラム最適化の2番目のルール(専門家のみ!):まだやらないでください。」
—マイケルA.ジャクソン
今がその時かどうかを知るには、ベンチマークとテストが必要です。
あなたが言及したように、高度に最適化されたコードの最大の問題は、維持が難しいことです。そのため、可能な限り、最適化された部分を最適化されていない部分から分離する必要があります。コンパイル時のリンク、ランタイム仮想関数呼び出し、またはその間の何かを介してこれを行うかどうかは関係ありません。重要なのは、テストを実行するときに、現在関心のあるすべてのバージョンに対してテストできるようにすることです。
生産コードの基本的な最適化されていないバージョンを常に使用してコードの意図を理解できるようにシステムを構築し、最適化されたバージョンを含むこれと一緒に異なる最適化されたモジュールを構築し、どこでも明示的に文書化します最適化されたバージョンはベースラインとは異なります。テスト(ユニットおよび統合)を実行するときは、最適化されていないバージョンおよび現在最適化されているすべてのモジュールで実行します。
例
たとえば、高速フーリエ変換関数があるとします。たぶん、あなたはで基本的なアルゴリズムの実装fft.c
とテストをしていfft_tests.c
ます。
次にPentiumが登場しfft_mmx.c
、MMX命令を使用して固定小数点バージョンを実装することにします。その後、pentium 3が登場し、Streaming SIMD Extensionsを使用するバージョンをに追加することにしましたfft_sse.c
。
CUDAを追加したいので、を追加fft_cuda.c
しますが、何年も使用しているテストデータセットでは、CUDAバージョンはSSEバージョンよりも遅いことがわかります!いくつかの分析を行って、100倍大きいデータセットを追加すると、期待どおりのスピードアップが得られますが、CUDAバージョンを使用するためのセットアップ時間が非常に長く、小さなデータセットでは、そのセットアップコストのないアルゴリズム。
これらの各ケースでは、同じアルゴリズムを実装し、すべて同じように動作する必要がありますが、異なるアーキテクチャで異なる効率と速度で実行されます(まったく実行される場合)。ただし、コードの観点からは、ソースファイルの任意のペアを比較して、同じインターフェイスが異なる方法で実装されている理由を確認できます。通常、最も簡単な方法は、元の最適化されていないバージョンを参照することです。
同じことは、最適化されていないアルゴリズムを実装する基本クラスと派生クラスが異なる最適化を実装するOOP実装にも当てはまります。
重要なことは、同じものに保つことです同じになるように、違いは明白です。