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

アプリケーションのパフォーマンスの向上に関する質問です。これは、ソフトウェアアーキテクチャの選択からアルゴリズムの選択までさまざまです。

9
「時期尚早な最適化がすべての悪の根源」についての誤解に対処する方法は?
私は、一般的な英語の意味で「最適化」とみなされるものに対して独断的に多くの人々に出会いました。そして、彼らは非常にしばしば「部分的な」引用「早すぎる最適化はすべての悪の根源」です彼らのスタンスの正当化として、私が話していることは何でも「時期尚早の最適化」であると解釈することを意味します。しかし、これらのビューは非常に馬鹿げているため、最も純粋な「単純な」実装からのあらゆる種類のアルゴリズムまたはデータ構造の逸脱、または少なくとも以前のやり方からの逸脱を排除します。「パフォーマンス」や「最適化」について聞いてからシャットダウンした後に再び「耳を開く」ように、このような人々にどのようにアプローチできますか?「この男は10行のコードに2週間を費やしたい」とすぐに思わせることなく、パフォーマンスに影響を与える設計/実装のトピックについて議論するにはどうすればよいですか。 さて、「すべての最適化は時期尚早ので、悪である」かどうかのスタンスがいるすでにここにカバーされてだけでなく、ウェブの他のコーナーで、すでに議論されている最適化は時期尚早ので、悪の場合に認識する方法が、残念ながら、現実の世界には、反最適化への信仰への挑戦に対してあまり開かれていない人々がまだいます。 以前の試み 数回、「時期尚早の最適化は悪い」↛「すべての最適化は悪い」と説明するために、ドナルドクヌースから完全な引用を提供しようとしました。 私たちは小さな効率を忘れてはなりません。約97%の時間です。早すぎる最適化はすべての悪の根源です。しかし、その重要な3%でチャンスを逃してはなりません。 しかし、見積もり全体を提供するとき、これらの人々は実際に、私がやっていることはPremature Optimization™であると確信し、耳を傾けて拒否します。それはまるで「最適化」という言葉が彼らを怖がらせるかのようです:数回、「optimiz(e | ation)」という言葉の使用を単に避けることで、拒否されずに実際のパフォーマンス改善コードの変更を提案することができました( 「パフォーマンス」も同様です-その言葉も怖いです)代わりに、「代替アーキテクチャ」や「改善された実装」のような表現を使用しています。このため、これは本当に独断的であり、実際に私が言うことを批判的に評価し、それを不要であるか、費用がかかりすぎると却下するのではないようです。

2
Python(および他の動的言語)のどのセマンティック機能がその速度低下に寄与していますか?
私はPythonをよく知りません。動的言語(Python、Lua、Scheme、Perl、Rubyなど)の正確な機能が実装を強制的に遅らせていることを、より正確に理解しようとしています。 その一例として、Lua 5.3 メタテーブル機構は直感的にLuaを非常に遅くしますが、実際にはLuaは非常に高速(およびPythonよりも高速)であると噂されています。 また、私は現在のプロセッサ上のため、メモリがはるかに遅い生の計算よりであることを直感(おそらく間違ったものを)持っているラà、動的な型チェック((キャッシュミスでメモリアクセスが算術演算の何百ものと同じ時間が必要)if (value->type != INTEGER_TAG) return;でCの用語)は非常に高速に実行できます。 もちろん、プログラム全体の分析(スターリンスキームの実装のように)は、翻訳者が高速で実行されるため、動的言語の実装を行うことができますが、最初はプログラムアナライザー全体を設計する時間がないふりをしましょう。 (私はMELTモニターで動的言語を設計するようなもので、その一部はCに翻訳されます)

5
複数のデータベースアクセスまたは1つの大規模なアクセス?
それは、パフォーマンスと最適なリソース使用率に来るときよりよいアプローチは何である:それだけが必要なときに必要な正確な情報を入手するために複数回のAJAXを介してデータベースにアクセスする、またはすべての情報保持するオブジェクト取得するために、一回のアクセスを実行する可能性が必要となることを、すべてが実際に必要なわけではないという高い確率で? 実際のクエリをベンチマークする方法は知っていますが、何千人ものユーザーがデータベースに同時にアクセスしているときのデータベースパフォーマンスに関して、接続プーリングがどのように作用するかをテストする方法はわかりません。
25 performance  sql 

6
LMAXのチームがなぜJavaを使用し、GCを避けるためにアーキテクチャを設計したのですか?
LMAXのチームがJavaでLMAX Disruptorを設計したのに、GCの使用を最小限に抑えることがすべての設計ポイントであるのはなぜですか?GCを実行したくない場合、ガベージコレクションされた言語を使用するのはなぜですか? 彼らの最適化、ハードウェアの知識のレベル、そして彼らが置いた思考はただ素晴らしいですが、なぜJavaなのでしょうか? 私はJavaなどに反対ではありませんが、なぜGC言語なのですか?DのようなものやGCを使用しない他の言語を使用して、効率的なコードを使用できるのはなぜですか?チームはJavaに最も精通しているのでしょうか、それともJavaには私には見られない独自の利点がありますか? 手動のメモリ管理でDを使用して開発するとしますが、違いは何でしょうか?低レベル(既にある)を考える必要がありますが、システムがネイティブであるため、システムから最高のパフォーマンスを引き出すことができます。

4
データ指向設計-1-2を超える構造の「メンバー」では非実用的ですか?
データ指向設計の通常の例は、ボール構造です。 struct Ball { float Radius; float XYZ[3]; }; そして、彼らはstd::vector<Ball>ベクトルを繰り返すアルゴリズムを作ります。 次に、同じことを提供しますが、データ指向設計で実装されます。 struct Balls { std::vector<float> Radiuses; std::vector<XYZ[3]> XYZs; }; 最初にすべての半径で、次にすべての位置などで反復する場合、これは良いことです。ただし、ベクター内のボールをどのように移動しますか?元のバージョンでは、を持っている場合std::vector<Ball> BallsAll、any BallsAll[x]をanyに移動できますBallsAll[y]。 ただし、データ指向バージョンでこれを行うには、すべてのプロパティに対して同じことを行う必要があります(ボールの場合は2回-半径と位置)。しかし、より多くのプロパティがある場合は悪化します。「ボール」ごとにインデックスを保持する必要があり、それを移動しようとすると、プロパティのすべてのベクトルで移動する必要があります。 それは、データ指向設計のパフォーマンス上の利点を損なうものではありませんか?

4
文字列を連結して1回呼び出すよりも、println()を頻繁に呼び出すのはどれほど悪いでしょうか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Code Review Stack Exchangeから移行されました。 5年前に移行され ました。 コンソールへの出力はコストのかかる操作であることは知っています。コードを読みやすくするために、長いテキスト文字列を引数として使用するのではなく、関数を呼び出してテキストを2回出力する方がよい場合があります。 たとえば、どれだけ効率が悪いのか System.out.println("Good morning."); System.out.println("Please enter your name"); 対 System.out.println("Good morning.\nPlease enter your name"); 例では、違いは1回の呼び出しのみprintln()ですが、それ以上の場合はどうなりますか? 関連するメモでは、印刷するテキストが長い場合、ソースコードを表示しているときにテキストの印刷に関連するステートメントが奇妙に見えることがあります。テキスト自体を短くすることができないと仮定すると、何ができますか?これは、複数のprintln()呼び出しが行われる場合ですか?誰かがコード行を80文字(IIRC)を超えてはならないと言っていたので、どうしますか System.out.println("Good morning everyone. I am here today to present you with a very, very lengthy sentence in order to prove a point about how it …
23 java  c++  performance  c  io 

4
Javaのパフォーマンスを大幅に向上させる方法は?
LMAXのチームは、1ミリ秒未満のレイテンシで100k TPSを実行する方法についてプレゼンテーションを行いました。彼らは、ブログ、テクニカルペーパー(PDF)、およびソースコード自体を使用して、そのプレゼンテーションをバックアップしています。 最近、Martin Fowler氏は、公開LMAXアーキテクチャ上の優れた論文を、チームがパフォーマンスに大きさの別の注文を上がるために取ったステップのいくつかを、彼らは今、毎秒600万件の注文を処理することができることを言及し、ハイライト。 これまで、ビジネスロジックプロセッサの速度の鍵は、すべてをメモリ内で順番に実行することであると説明してきました。これを実行するだけで(本当に愚かではありません)、開発者は10K TPSを処理できるコードを作成できます。 その後、優れたコードの単純な要素に集中することで、これを100K TPSの範囲に引き上げることができることがわかりました。これには、適切にコード化されたコードと小さなメソッドが必要です-基本的に、これによりHotspotは最適化のより良い仕事をすることができ、実行中のコードをより効率的にキャッシュすることができます。 もう1桁上るには、もう少し賢くなりました。LMAXチームがそこにたどり着くのに役立つとわかったことがいくつかあります。1つは、キャッシュに対応し、ゴミに注意するように設計されたJavaコレクションのカスタム実装を記述することでした。 その最高レベルのパフォーマンスに到達する別の手法は、パフォーマンステストに注意を払うことです。私は長い間、人々がパフォーマンスを改善するためのテクニックについて多くのことを話していることに気づきましたが、実際に違いを生むのはそれをテストすることです ファウラーは、発見されたいくつかの事柄があると述べましたが、彼はいくつかだけに言及しました。 このようなレベルのパフォーマンスを達成するのに役立つ他のアーキテクチャ、ライブラリ、テクニック、または「もの」はありますか?

7
ソフトウェアの腐敗とは、主にパフォーマンスのことですか、それとも面倒なコードのことですか?
ソフトウェア腐敗のウィキペディアの定義は、ソフトウェアのパフォーマンスに焦点を当てています。これは私が慣れているものとは異なる使用法です。コードの清潔さとデザインの観点から、コードのすべての標準品質特性(読みやすさ、保守性など)を考慮して、それ以上に考えていました。何が起こっているのか誰も知らないからです。しかし、ソフトウェアの腐敗という用語には、パフォーマンスに特別な言及がありますか?または私はそれがコードの清潔さを指していると思うのは正しいですか?または、これはおそらく、用語の複数の感覚が一般的に使用されている場合です。ユーザーの観点からは、パフォーマンスに関係しています。しかし、ソフトウェア職人にとっては、コードの読み方をより具体的にする必要がありますか?

10
「開発者の不適切な最適化の直感」を回避するにはどうすればよいですか?
この声明を発表した記事を見ました: 開発者は、適切な理由でコードを最適化することを好みます。それはとても満足で楽しいです。ただし、最適化のタイミングを知ることははるかに重要です。残念ながら、開発者は一般に、アプリケーションのパフォーマンスの問題が実際にどこにあるのかについて恐ろしい直感を持っています。 開発者はこの悪い直感をどのように回避できますか?コードのどの部分が本当に最適化が必要かを見つけるための優れたツールはありますか(Javaの場合)?このテーマに関する記事、ヒント、または良い読み物を知っていますか?
22 java  performance 

11
低遅延コードは時々「ugい」必要がありますか?
(これは主に、低遅延システムに関する特定の知識を持っている人を対象とし、根拠のない意見で答えるだけの人を避けるためです)。 「いい」オブジェクト指向のコードを書くことと、非常に高速で低レイテンシーのコードを書くことの間にトレードオフがあると思いますか?たとえば、C ++の仮想関数/多態性などのオーバーヘッドを回避する-見た目は悪いが非常に高速なコードを書き換えるなど それは理にかなっています-maintainいように見える人は誰でも気にしません(メンテナンス可能であれば)-速度が必要な場合、速度が必要ですか? 私はそのような分野で働いた人々から話を聞きたいと思います。
21 java  c++  c  performance  latency 

16
パフォーマンスを改善するためにどのような簡単なテクニックを使用しますか?
コードを読みにくくすることなくパフォーマンスを向上させるために簡単なルーチンを記述する方法について話している...たとえば、これは私たちが学んだ典型的なものです: for(int i = 0; i < collection.length(); i++ ){ // stuff here } しかし、私は通常、a foreachが該当しない場合にこれを行います。 for(int i = 0, j = collection.length(); i < j; i++ ){ // stuff here } lengthメソッドを一度だけ呼び出すので、これはより良いアプローチだと思います...私のガールフレンドはそれが不可解だと言います。自分の開発で使用する他の簡単なトリックはありますか?

6
一般に、分岐を避けるために仮想関数を使用する価値はありますか?
ブランチミスの仮想コストに相当する命令の大まかな同等物があるように思われますが、同様のトレードオフがあります。 命令対データキャッシュミス 最適化の障壁 次のようなものを見ると: if (x==1) { p->do1(); } else if (x==2) { p->do2(); } else if (x==3) { p->do3(); } ... メンバー関数配列を持つことができます。または、多くの関数が同じ分類に依存している場合、またはより複雑な分類が存在する場合は、仮想関数を使用します。 p->do() しかし、一般的には、それを分岐対仮想関数どのように高価であり、いずれかが親指の大まかなルールを持っていた場合(4などの単純なとしてそれがあった場合に素敵な私が思っていたので、一般化するのに十分なプラットフォーム上でテストするのは難しいですifsがブレークポイントです) 一般的に、仮想機能はより明確であり、私はそれらに寄りかかります。しかし、コードを仮想関数からブランチに変更できる非常に重要なセクションがいくつかあります。これに着手する前に、これについて考えたいと思います。(簡単な変更ではなく、複数のプラットフォームで簡単にテストすることもできません)
21 c++  performance 

10
開発の開始時または終了時に、パフォーマンスを向上させるためにソフトウェアを最適化するのはいつですか?
私はジュニアソフトウェア開発者であり、パフォーマンス(速度)を向上させるためにソフトウェアを最適化するのに最適な時期はいつになるのか疑問に思っていました。 ソフトウェアが非常に大きく、管理が複雑ではないと仮定すると、最初にそれを最適化するためにより多くの時間を費やす方が良いでしょうか、またはすべての機能を正しく実行するソフトウェアを開発し、パフォーマンスを向上させるために最適化を進めるべきですか?

2
効率を維持しながら、ビジネスロジックからユーザーインターフェイスを分離するにはどうすればよいですか?
コンボボックスで10個の異なるオブジェクトを表すフォームを表示したいとします。たとえば、トマトを含む10種類のハンバーガーのうち1つをユーザーに選択してもらいます。 UIとロジックを分離したいので、コンボボックスに表示するためにフォームにハンバーガーの文字列表現を渡す必要があります。そうでない場合、UIはオブジェクトフィールドを掘り下げる必要があります。次に、ユーザーはコンボボックスからハンバーガーを選択し、コントローラーに送信します。ここで、コントローラーは、フォームで使用される文字列表現(おそらくID?)に基づいて、ハンバーガーを再度検索する必要があります。 それは信じられないほど非効率ではありませんか?既に選択したいオブジェクトがありました。オブジェクト全体をフォームに送信してから特定のオブジェクトを返した場合、フォームがそのオブジェクトへの参照をすでに返しているため、後でそれを見つける必要はありません。 さらに、私が間違っていて、実際にオブジェクト全体をフォームに送信する必要がある場合、UIをロジックから分離するにはどうすればよいですか?

3
計算を行列乗算として表現すると、なぜ高速になるのですか?
TensorFlowを使用した GoogleのMNistチュートリアルでは、1つのステップが行列にベクトルを掛けることに相当する計算が示されています。Googleは最初に、計算の実行に使用される各数値の乗算と加算が完全に書き出された図を示します。次に、代わりに行列乗算として表されている図を示します。このバージョンの計算はより高速であるか、少なくとも高速であると主張しています。 それを方程式として書くと、次のようになります。 この手順を「ベクトル化」して、行列乗算とベクトル加算に変換できます。これは計算効率に役立ちます。(それはまた、考えるのに便利な方法です。) このような方程式は通常、機械学習の実践者によって行列乗算形式で記述されていることを知っています。もちろん、コードの簡潔さや数学の理解の観点からそうすることの利点を理解できます。私が理解していないのは、長文形式から行列形式への変換が「計算効率に役立つ」というGoogleの主張です 計算を行列乗算として表現することにより、いつ、なぜ、どのようにソフトウェアのパフォーマンスを向上させることができますか?人間として、2番目の(マトリックスベースの)イメージでマトリックスの乗算を自分で計算する場合、最初の(スカラー)イメージに示されている個別の計算を順番に実行することでそれを行います。私にとって、それらは同じ計算シーケンスの2つの表記法にすぎません。なぜ私のコンピューターと違うのですか?なぜコンピューターはスカラー計算よりも速くマトリックス計算を実行できるのでしょうか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.