タグ付けされた質問 「optimization」

最適化は、既存のプログラムを改善して、より効率的に、または/およびより少ないリソースを使用して動作させるプロセスです。

10
ソフトウェアの速度はどのくらいの頻度でお客様の目に見えますか?
理論的には、顧客はソフトウェアのパフォーマンスの向上を直接体験して感じることができるはずです。 実際には、改善が十分に目立たない場合があります。そのため、改善から収益を得るには、顧客を引き付けるためにマーケティングで見積もり可能なパフォーマンス数値を使用する必要があります。 知覚されるパフォーマンス(GUIレイテンシなど)とサーバー側のパフォーマンス(マシン、ネットワーク、インフラストラクチャなど)の違いはすでにわかっています。 プログラマーが他のプログラマーではなく、マネージャーや顧客であるパフォーマンス分析を「作成」するために、プログラマーが余分な時間を費やす必要がある頻度はどれくらいですか?

7
コードのリファクタリングと最適化は、アジャイルとウォーターフォールの両方のプロセスタイムラインのどこに適合させるべきですか?
プロジェクトマネジメントチームの間では、「機能する」とは100%完成したものと見なす必要があることを意味するというこの考え方があるようです。ほとんどのプログラマーは、常にそうであるとは限らないことを知っています。機能の一部を機能させるために別のアプローチを試みている場合、それは必ずしも最良の解決策を見つけたことを意味するわけではありません。私はよく何かをやり終えて、一歩下がって、ビジネスルールが満たされた後、自分に何ができるかを自問します。この「もっと上手にできる」時間は、タイムライン内のどこかに実際に収まるでしょうか。私は、最良のアプローチは、コードを見つけたときよりも常に(ある程度)そのままにしておくことであると考えています。これは、リリース後のリファクタリングを意味する可能性があります。しかしながら、

2
分岐予測の最適化に適したコードはどれですか?
分岐予測、およびコンパイラー最適化の影響を考えると、どのコードが優れたパフォーマンスを提供する傾向がありますか? bRareExceptionPresentはまれな状態を表すことに注意してください。ロジックの通常のパスではありません。 /* MOST COMMON path must branch around IF clause */ bool SomeFunction(bool bRareExceptionPresent) { // abort before function if(bRareExceptionPresent) { return false; } .. function primary body .. return true; } /* MOST COMMON path does NOT branch */ bool SomeFunction(bool bRareExceptionPresent) { if(!bRareExceptionPresent) { .. function primary …

4
時期尚早に最適化していますか?
私は現在、C ++のコンポーネントベースのアーキテクチャの設計段階にいます。 現在の設計には、次のような機能の使用法が含まれています。 std::vectorstd::shared_ptrコンポーネントを保持するsのs std::dynamic_pointer_cast std::unordered_map<std::string,[yada]> コンポーネントは、グラフィックス、物理学、AI、オーディオなど、ゲームのようなソフトウェアに必要なさまざまなアイテムのデータとロジックを表します。 キャッシュミスがパフォーマンスに影響を与える可能性のある場所をすべて読んだので、いくつかのテストを実行しました。その結果、実際にアプリケーションの速度が低下する可能性があると思いました。 前述の言語機能をテストすることはできませんでしたが、多くの場合、これらの機能にはコストがかかる傾向があり、可能であれば回避する必要があると言われています。 アーキテクチャの設計段階にあり、これらは設計のコアに含まれるので、パフォーマンスがある場合、後で変更するのは非常に難しいので、今それらを回避する方法を見つける必要があります。問題? それとも私は時期尚早の最適化をしているのですか?

3
小さいボックスから作成できる最大のボックスを抽出する私のアルゴリズムは遅すぎる
キューブベースのワールド(Minecraft、Trove、Cube Worldなど)を想像してください。すべてが同じサイズのキューブで構成され、すべてのキューブが同じ種類です。 目標は、最も少ない数の長方形のボックスで世界を表すことです(立方体をマージしますが、凸状の形状(長方形のボックスの形状)を保持します)。私のアルゴリズムはこれで成功しましたが、そのパフォーマンスは意図した目的には遅すぎます。より速いアルゴリズムはありますか? 私のアルゴリズムの疑似C#コードは基本的に次のとおりです。 struct Coordinate { int x,y,z; }; //<-- integer based grid HashSet<Coordinate> world; // <-- contains all the cubes //width, height, and length represent how many cubes it spans struct RectangularBox { Coordinate coord; int width,height,length; } void Begin() { List<RectangularBox> fewestBoxes = new List<RectangularBox>(); while(world.Count > …

3
最適化アルゴリズムの最適性を評価する一般的な方法はありますか?
最適化アルゴリズムの最適性を評価する一般的な方法はありますか。たとえば、NPハード問題またはNP完全問題を解くアルゴリズムなどです。 これまでに私が思いついた唯一の方法は、アルゴリズムの結果を既知の最適解と比較することです。 そうでない場合、いくつかの特別な問題のための特定の方法はありますか? 編集明確にするために:最適性とは、結果が最適解の結果にどれだけ近いかを意味します。

11
どこを最適化しますか?
速度を最適化するために2つの領域があります。 最も時間を費やしている場所 最も呼び出されるコード 最適化を始めるのに最適な場所はどれですか? 多くの場合、最も頻繁に呼び出されるコードは、既に実行時間が短いです。遅い、あまり呼ばれていない領域を最適化するか、またはより速く、頻繁に使用される領域の最適化に時間を費やしていますか?

5
パフォーマンスを低下させることなく、Pimplバリエーションを実装できますか?
pimplの問題の1つは、それを使用するとパフォーマンスが低下することです(追加のメモリ割り当て、不連続なデータメンバー、追加の間接参照など)。pimplのすべての利点が得られないという犠牲を払ってこれらのパフォーマンスのペナルティを回避する、pimplイディオムのバリエーションを提案したいと思います。アイデアは、クラス自体にすべてのプライベートデータメンバーを残し、プライベートメソッドのみをpimplクラスに移動することです。基本的なpimplと比較した場合の利点は、メモリが連続している(追加の間接参照がない)ことです。pimplをまったく使用しない場合と比較した場合の利点は次のとおりです。 プライベート関数を非表示にします。 これらのすべての関数が内部リンケージを持ち、コンパイラーがより積極的に最適化できるように構造化できます。 したがって、私の考えは、pimplをクラス自体から継承させることです(私は少し奇妙に聞こえますが、我慢してください)。次のようになります。 Ahファイル: class A { A(); void DoSomething(); protected: //All private stuff have to be protected now int mData1; int mData2; //Not even a mention of a PImpl in the header file :) }; A.cppファイル: #define PCALL (static_cast<PImpl*>(this)) namespace //anonymous - guarantees internal linkage { struct PImpl …

1
プロファイリングツールが使用できない場合、プログラムのパフォーマンスを最適化するにはどうすればよいですか?
現在、パフォーマンスを改善したいOpenGlプログラムに取り組んでいます。パフォーマンスは大丈夫ですが、強力な専用GPUでは理想的ではありませんが、統合グラフィックス(<10 fps)ではひどいです。通常のプログラム(CPUベース、OpenGlまたは他のGPU APIなし)では、プログラムでプロファイラー(おそらくCLionに組み込まれているもの)を実行し、ほとんどの時間を費やしている場所を確認してから、より良いアルゴリズムで作業しますそれらのエリアの場合、またはそのエリアが呼び出される量を減らす方法を見つけます。 OpenGlプログラムでこの手法を使用すると、メインスレッド(最適化したいスレッド)でのプログラムの時間の大部分(約86%)がOpenGlドライバーの.soファイルに費やされていることがわかります。さらに、プログラムの実行中のCPU使用率は非常に低いですが、GPU使用率は95%から100%の間で停止します。これらの情報を総合すると、ボトルネックがGPUにあるため、最適化する必要があることがわかります。 ここで問題が発生します。ただし、プロファイラーを使用して私の最適化を導く通常のテクニックは、特定のGPUプロファイラーがないと機能しません。そのため、GPU処理時間が費やされている場所を教えてくれるプロファイラーを見つけるために、いくつかの調査を行いました。リモートで使用できるものは何も見つかりませんでした。すべてがWindowsのみ(Linuxのみを実行しており、プログラムはまだWindowsに移植されていません-ずっと先までは移植されません)であるか、更新されていないか、および/またはこのプロジェクトです。 そのため、私は質問します。関連するプロファイラーが存在しない場合、プログラムのパフォーマンスをどのように最適化できますか?問題がどこにあるのかを推測し、そこから最適化を試みましたが、最適化(錐台カリング)によってGPUの作業が約半分になっていることが確認できたとしても、違いはありませんでした。良い答えは、Linux上のOpenglに適用可能なプロファイリング手法を提供するか、プロファイラーなしで機能する手法を提供することです。

6
プログラミング言語や副作用のないプログラムについて理由を説明する方が簡単なのはなぜですか?
リチャード・P・ガブリエルから「Yの理由」を読みました。Yコンビネーターに関する読みやすい記事ですが、めったにありません。記事は、階乗関数の再帰的な定義から始まります。 (letrec ((f (lambda (n) (if (< n 2) 1 (* n (f (- n 1))))))) (f 10)) そしてそれはletrec副作用で定義できることを説明します: (let ((f #f)) (set! f (lambda (n) (if (< n 2) 1 (* n (f (- n 1)))))) (f 10)) また、記事の残りの部分ではletrec、Yコンビネーターを使用して定義することもできると説明しています。 (define (Y f) (let ((g (lambda (h) (lambda (x) ((f …

6
パフォーマンスと再利用性
パフォーマンスを犠牲にすることなく再利用可能な関数を作成するにはどうすればよいですか?関数を再利用可能にする方法で関数を記述したい(たとえば、データ環境について仮定しない)状況に繰り返し直面していますが、プログラムの全体的な流れを知っているので、最も効率的ではありません。方法。たとえば、株式コードを検証するが再利用可能な関数を記述したい場合、レコードセットが開いているとは限りません。ただし、関数が呼び出されるたびにレコードセットを開いたり閉じたりすると、数千行をループするときにパフォーマンスに大きな影響が出る可能性があります。 だからパフォーマンスのために私は持っているかもしれません: Function IsValidStockRef(strStockRef, rstStockRecords) rstStockRecords.Find ("stockref='" & strStockRef & "'") IsValidStockRef = Not rstStockRecords.EOF End Function しかし、再利用性のためには、次のようなものが必要になります。 Function IsValidStockRef(strStockRef) Dim rstStockRecords As ADODB.Recordset Set rstStockRecords = New ADODB.Recordset rstStockRecords.Open strTable, gconnADO rstStockRecords.Find ("stockref='" & strStockRef & "'") IsValidStockRef = Not rstStockRecords.EOF rstStockRecords.Close Set rstStockRecords = Nothing End Function 数千行/レコードにわたるループ内から呼び出されたときに、そのレコードセットを開いたり閉じたりするパフォーマンスへの影響は深刻ですが、最初の方法を使用すると、関数の再利用性が低下するのではないかと心配です。 …


5
マイクロ最適化はモバイルデバイスで価値がありますか?
通常、マイクロ最適化は次の説明では価値がないと見なされます。プログラムを1パーセント未満高速化する可能性がありますが、その小さなブーストを気にする人はいません。 さらに、1秒間に1000回起動し、非常に高速に終了するイベントハンドラが存在する可能性があります。それがどれほど速いかは誰も気にしません-それがすでに「観察できるほど速い」ので、それを速くすることは注目に値しません。 ただし、モバイルデバイスではエネルギー消費が重要な要素です。同じイベントハンドラーを10%速く実行するように最適化すると、消費されるエネルギーが少なくなり、バッテリー寿命が長くなり、デバイスの動作時間が長くなります。 モバイルデバイスに関する後者の判断はどの程度正確ですか?それを確認または反証する実際の例はありますか?

2
大規模なサイトはどのようにスケールアップし、大量のトラフィックに最適化しますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 6年前休業。 FacebookやTwitterなどのサイトは、大量のトラフィックのためにサイトをどのように最適化しますか。最高のサーバーを入手するために多額の費用を費やす以外に、大量のトラフィックに対応するためにコードで何を最適化できますか? 静的HTMLへのページのキャッシュについて読みましたが、ページが絶えず更新されるソーシャルネットワーキングサイトには実用的ではありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.