web-dev-qa-db-ja.com

誰もがソフトウェアをより速く実行するためのアイデアを試すことができる期間を育成していますか?

時々、ソフトウェアのパフォーマンストリックは、方法論的かつ徹底的な検索から発見されます。クレイジーなアイデアを試すには、発散的な思考と勇気が必要な場合があります。アイデアは、多くのハードワークを伴う必要があるほんの始まりに過ぎない場合があります。

誰もが私たちが取り組んでいるソフトウェアのパフォーマンスを改善するためにさまざまなアイデアを試すことができる期間をどのように促進するのですか?チームの全員が少なくとも数か月間のソフトウェアの経験があり、ソフトウェアに非常に優れています。

発散的な考え方がソフトウェアのパフォーマンスを改善する方法を見つけるのに役立つことに同意しますか?どうして?何故なの?

最適化のアイデアをすばやく試すことができるテクニックはどれですか。トライアウトから良い結果を得るには、速いコーディング速度が必要ですか?

最後に、たるみの可能性を生み出すことなく良好な結果を保証するために、どのくらいの「時間」を割り当てる必要がありますか?

「何かを行うためのより速い方法」が存在することを証明するために実験は必要ですか? (2011年6月7日追加)

関連:

報奨金のみの目的で-2011/06/07チームサイズは2〜4人の開発者で、専用のQAはありません。すべてのコード、ユニットテスト、パフォーマンステスト開発者が行います。プロジェクトの性質上、プロファイラの結果は、たとえ単一のボトルネックを明らかにしていなくても、比例した実行時間を示すのに役立ちます。

17
rwong

あなたの最善の策は、プロファイラーでホットスポットを特定し、チームとしてホットスポットを修正する方法について話し合うことです。

改善を測定および文書化できる必要があります(そのため、単なる推測ではありません)。チームでそれを行うことで、修正される内容と方法を人々が確実に把握できるようになります。

プログラマーがアイデアを試すコードベースを乱暴にハッキングするということは、何が起こっているのか、それが機能するかどうかを制御できないことを意味します。

21
user1249

プログラマーは賢く創造的である傾向があります(これらはプログラミングが上手であるための前提条件であるため)。問題を解決しようとするときは、幅広いアイデアを試してみることが常に良いことです。ただし、パフォーマンスを改善しようとするときに覚えておかなければならない重要なことが2つあります(「パフォーマンス」とは実行速度を低下させることを意味します)。

  • アルゴリズムによる最適化は、他のものよりもはるかにうまく機能する傾向があります。簡単な例として、bubblesortの実装に対して行うことは何でも、十分な数の場合、quicksortの非常に遅い実装は最終的にはより高速になります。
  • パフォーマンスに関連することを行うことは、測定に基づいて(プロファイルを作成して)結果に基づいて何もしない限り、まったく意味がありません。

私の主なポイントは、野生の実験の期間を開始する前に、これらのことに関して全員と同じページにいることを確認することが重要であることです。経験の浅い同僚が、うまくいかないことを試みていたことを後で知ることは常に残念です(そして、前もって彼らにそのことを伝えたかもしれません)。

6
Deckard

以前のいくつかのチームで成功したプラクティスの1つは、Deep Divesのコンセプトを持つことでした。数人が会議室に集まり、いくつかのユーザーシナリオを決定し、コードをステップ実行するか、プロファイラーログを確認するだけです。場合によっては、データにボトルネックがはっきりと示されているため、自分のコードに実際にパフォーマンスの問題があることを懐疑論者に納得させることができました。これを成功させるために、私たちが従ったいくつかの主要な信条がありました:

  1. ボトルネックが疑われるクリティカルシナリオまたはコードパスに焦点を当てるようにしてください。最適化する必要のないものを最適化するのに時間を無駄にしないでください(壊れていなければ...)
  2. グループを小さくし、コードを最もよく知っている人に焦点を合わせます。機能のテスターとプログラムマネージャーを含めることを忘れないでください。彼らには重要な洞察があり、参加することや、より良いテスト方法に関する情報を収集することから利益を得ることができます。
  3. エリアの所有者に、高レベルの建築ブロックレベルの図とエリアの概要を説明してもらい、セッションを開始します。主要コンポーネントとは何か、そしてそれらが何をするかを簡単に説明します。コードを掘り下げた後、ブロックダイアグラムが現実を反映しなかった回数に驚くでしょう。 (実際の引用:「そのコンポーネントをまだ使用していることを知りませんでした。その年前に取り除くと思ったのです!」)
  4. 機能上のバグやパフォーマンスの問題を見つけてください。それはいい。また、重要なことは何も見つからないこともあります。それも良いことです。
  5. いくつかの長いセッションがあることを期待してください。これらは作業会議です。快適になり、それを通して働きます。全員が協力して長時間のストレッチを行うと、より多くのことを成し遂げることができます。
  6. メモをとってください。欠陥追跡データベースを使用する場合は、優先度が低くても、問題をすぐに開いて追跡できるようにすることを検討してください。

チーム全体が「パフォーマンスプッシュ」に参加することは避けてください。これらは通常、別の回答で ThorbjørnRavn Andersen が言及されているため、経営陣が期待する結果にはなりません。一部の領域では大きな利益が得られ、他の分野では馴染みのない領域では回帰が得られます。「完了」と言うためにどの程度の利益を得る必要があるかを予測/追跡することは困難です。それは経営者とのやりがいのある会話です。

1
nithins

悲しいことに、私は経験から話すことができません。しかし、 アトラシアンには1日しかありません とあり、従業員が自分の好きなことをしたり、パーティーの雰囲気の中で自分のアイデアを発表したりできるようになりました。どうやら彼らにとってはうまくいった。しかし、私はアンダーセンに同意する必要があり、パフォーマンスに関しては、創造的ですぐに使えるアイデアは、どのプロセスに最も時間がかかるかをプロファイリングするよりも重要ではないと言います。おそらく、システムのプロファイルを作成したら、プロセスの重要なセクションをスピードアップする方法についてのアイデアを思いつくために、全員に1日を与えることができます。彼らがアイデアを発表したら、どのアイデアを試すかを選択できます。

1
Philip

一般的に(**)実験してもパフォーマンスは向上しません。

あなたはそれを手に入れます

  • シンプルで効率的なデザインの作成方法を理解する。この部分が間違っていると、実験で大きな違いはありません。たとえば、コードジェネレーターの使用が優れた設計アプローチであるかどうかを判断する方法を知っています。

  • A)パーセンテージベースで高価であり、b)より優れたものと交換可能なアクティビティを特定することによってソフトウェアを調整する方法を知る。 「プロファイラーを使用する」必要があることは誰もが知っていますが、それだけでは十分ではありません。

他の質問に対するこの回答を確認してください。

**例外は、グラフィックスレンダリング、プロセッサパイプラインやCUDAの動作などのハードウェアに依存するタイトなコード、またはネットワークまたはDBプロトコルの実験など、最適な使用方法に慣れる必要がある場合があります。

追加:大規模システムのプログラマーの多くが驚くべきことを見つけました。完全に適切に構築された大規模なプログラムでは、大きくて見えないパフォーマンスの問題が発生する可能性があり、ローカライズされていないためプロファイラーはそれらを見つけることができませんルーチンに。プログラムは非常に最良のスタイルで実行されますが、これらはプログラムの一般的な構造の一部です。

具体例を示すと、 ここにプログラムがあります ジョブを実行するソースコード(C++)です。それは私が取り組んだ実際のCプログラムから抽出されたものです。

それは意図したことを行いますが、その時間のどの部分が本当に必要ではないのですか?どれだけ高速化できるでしょうか?

さて、プログラムの最初のバージョンでは、完全に合理的に見える非ローカルなもの(プロファイラーからは見えません)が33.3%の時間を費やしていました。それが交換されたとき、その時間は節約され、それがプログラムの2番目のバージョンでした。

プログラムの2番目のバージョンでは、削除できる他の(プロファイラーからは見えない)何かが16.7%の時間を要していました。それを削除するとバージョン3になります。

バージョン3では、13%が削除されました。残ったもののうち、66%が削除されました。その後残ったもののうち、61%が削除されました!

そして、最後に残ったもののうち、98%が削除されました!

それで、全体像は何ですか?元のプログラムが費やした1000サイクルごとに、何サイクルが削除されましたか? 998!

すべてのプログラムは異なりますが、私の経験では、すべての大規模なプログラムには、プロファイラーが検出できない一連の時間のかかる問題があり、手動でサンプリングすることもあり、プログラマーがそうである場合真に最大のパフォーマンスを実現し、大幅な高速化のために削除できます。

0
Mike Dunlavey

ソフトウェアの速度を改善する必要がある理由は、ソフトウェアの速度が著しく遅い場合です。そうでない場合、最適化は時間の無駄です。しかし、何かが遅い場合は、タスクを実行します。

...そして、タスクを実行するには、次の2つのステップがあります。

  1. タスクを実行している関数が効率的に記述されているかどうかを確認してください。良いアルゴリズムと悪いアルゴリズムがありますか?それは効率的な方法でデータベースにアクセスしていますか? 1回でできるのに100回ループしてるの?多くの場合、コードを簡単に検査することで1つの障害を見つけ、それを修正するだけでなく、より優れたプログラマーになることができます。

  2. 数1に1時間以上費やすことはしないでください。問題が1時間以内に見つからない場合は、プロファイラーを使用して問題の箇所を見つけてください。問題のポイントがわかったら、1に戻ってそれを再度実行し、特定したコードを改善するための最善の方法を見つけます。

0
lkessler