時々、ソフトウェアのパフォーマンストリックは、方法論的かつ徹底的な検索から発見されます。クレイジーなアイデアを試すには、発散的な思考と勇気が必要な場合があります。アイデアは、多くのハードワークを伴う必要があるほんの始まりに過ぎない場合があります。
誰もが私たちが取り組んでいるソフトウェアのパフォーマンスを改善するためにさまざまなアイデアを試すことができる期間をどのように促進するのですか?チームの全員が少なくとも数か月間のソフトウェアの経験があり、ソフトウェアに非常に優れています。
発散的な考え方がソフトウェアのパフォーマンスを改善する方法を見つけるのに役立つことに同意しますか?どうして?何故なの?
最適化のアイデアをすばやく試すことができるテクニックはどれですか。トライアウトから良い結果を得るには、速いコーディング速度が必要ですか?
最後に、たるみの可能性を生み出すことなく良好な結果を保証するために、どのくらいの「時間」を割り当てる必要がありますか?
「何かを行うためのより速い方法」が存在することを証明するために実験は必要ですか? (2011年6月7日追加)
関連:
(報奨金のみの目的で-2011/06/07チームサイズは2〜4人の開発者で、専用のQAはありません。すべてのコード、ユニットテスト、パフォーマンステスト開発者が行います。プロジェクトの性質上、プロファイラの結果は、たとえ単一のボトルネックを明らかにしていなくても、比例した実行時間を示すのに役立ちます。
あなたの最善の策は、プロファイラーでホットスポットを特定し、チームとしてホットスポットを修正する方法について話し合うことです。
改善を測定および文書化できる必要があります(そのため、単なる推測ではありません)。チームでそれを行うことで、修正される内容と方法を人々が確実に把握できるようになります。
プログラマーがアイデアを試すコードベースを乱暴にハッキングするということは、何が起こっているのか、それが機能するかどうかを制御できないことを意味します。
プログラマーは賢く創造的である傾向があります(これらはプログラミングが上手であるための前提条件であるため)。問題を解決しようとするときは、幅広いアイデアを試してみることが常に良いことです。ただし、パフォーマンスを改善しようとするときに覚えておかなければならない重要なことが2つあります(「パフォーマンス」とは実行速度を低下させることを意味します)。
私の主なポイントは、野生の実験の期間を開始する前に、これらのことに関して全員と同じページにいることを確認することが重要であることです。経験の浅い同僚が、うまくいかないことを試みていたことを後で知ることは常に残念です(そして、前もって彼らにそのことを伝えたかもしれません)。
以前のいくつかのチームで成功したプラクティスの1つは、Deep Divesのコンセプトを持つことでした。数人が会議室に集まり、いくつかのユーザーシナリオを決定し、コードをステップ実行するか、プロファイラーログを確認するだけです。場合によっては、データにボトルネックがはっきりと示されているため、自分のコードに実際にパフォーマンスの問題があることを懐疑論者に納得させることができました。これを成功させるために、私たちが従ったいくつかの主要な信条がありました:
チーム全体が「パフォーマンスプッシュ」に参加することは避けてください。これらは通常、別の回答で ThorbjørnRavn Andersen が言及されているため、経営陣が期待する結果にはなりません。一部の領域では大きな利益が得られ、他の分野では馴染みのない領域では回帰が得られます。「完了」と言うためにどの程度の利益を得る必要があるかを予測/追跡することは困難です。それは経営者とのやりがいのある会話です。
悲しいことに、私は経験から話すことができません。しかし、 アトラシアンには1日しかありません とあり、従業員が自分の好きなことをしたり、パーティーの雰囲気の中で自分のアイデアを発表したりできるようになりました。どうやら彼らにとってはうまくいった。しかし、私はアンダーセンに同意する必要があり、パフォーマンスに関しては、創造的ですぐに使えるアイデアは、どのプロセスに最も時間がかかるかをプロファイリングするよりも重要ではないと言います。おそらく、システムのプロファイルを作成したら、プロセスの重要なセクションをスピードアップする方法についてのアイデアを思いつくために、全員に1日を与えることができます。彼らがアイデアを発表したら、どのアイデアを試すかを選択できます。
一般的に(**)実験してもパフォーマンスは向上しません。
あなたはそれを手に入れます
シンプルで効率的なデザインの作成方法を理解する。この部分が間違っていると、実験で大きな違いはありません。たとえば、コードジェネレーターの使用が優れた設計アプローチであるかどうかを判断する方法を知っています。
A)パーセンテージベースで高価であり、b)より優れたものと交換可能なアクティビティを特定することによってソフトウェアを調整する方法を知る。 「プロファイラーを使用する」必要があることは誰もが知っていますが、それだけでは十分ではありません。
**例外は、グラフィックスレンダリング、プロセッサパイプラインやCUDAの動作などのハードウェアに依存するタイトなコード、またはネットワークまたはDBプロトコルの実験など、最適な使用方法に慣れる必要がある場合があります。
追加:大規模システムのプログラマーの多くが驚くべきことを見つけました。完全に適切に構築された大規模なプログラムでは、大きくて見えないパフォーマンスの問題が発生する可能性があり、ローカライズされていないためプロファイラーはそれらを見つけることができませんルーチンに。プログラムは非常に最良のスタイルで実行されますが、これらはプログラムの一般的な構造の一部です。
具体例を示すと、 ここにプログラムがあります ジョブを実行するソースコード(C++)です。それは私が取り組んだ実際のCプログラムから抽出されたものです。
それは意図したことを行いますが、その時間のどの部分が本当に必要ではないのですか?どれだけ高速化できるでしょうか?
さて、プログラムの最初のバージョンでは、完全に合理的に見える非ローカルなもの(プロファイラーからは見えません)が33.3%の時間を費やしていました。それが交換されたとき、その時間は節約され、それがプログラムの2番目のバージョンでした。
プログラムの2番目のバージョンでは、削除できる他の(プロファイラーからは見えない)何かが16.7%の時間を要していました。それを削除するとバージョン3になります。
バージョン3では、13%が削除されました。残ったもののうち、66%が削除されました。その後残ったもののうち、61%が削除されました!
そして、最後に残ったもののうち、98%が削除されました!
それで、全体像は何ですか?元のプログラムが費やした1000サイクルごとに、何サイクルが削除されましたか? 998!
すべてのプログラムは異なりますが、私の経験では、すべての大規模なプログラムには、プロファイラーが検出できない一連の時間のかかる問題があり、手動でサンプリングすることもあり、プログラマーがそうである場合真に最大のパフォーマンスを実現し、大幅な高速化のために削除できます。
ソフトウェアの速度を改善する必要がある理由は、ソフトウェアの速度が著しく遅い場合です。そうでない場合、最適化は時間の無駄です。しかし、何かが遅い場合は、タスクを実行します。
...そして、タスクを実行するには、次の2つのステップがあります。
タスクを実行している関数が効率的に記述されているかどうかを確認してください。良いアルゴリズムと悪いアルゴリズムがありますか?それは効率的な方法でデータベースにアクセスしていますか? 1回でできるのに100回ループしてるの?多くの場合、コードを簡単に検査することで1つの障害を見つけ、それを修正するだけでなく、より優れたプログラマーになることができます。
数1に1時間以上費やすことはしないでください。問題が1時間以内に見つからない場合は、プロファイラーを使用して問題の箇所を見つけてください。問題のポイントがわかったら、1に戻ってそれを再度実行し、特定したコードを改善するための最善の方法を見つけます。