低遅延コードは時々「ugい」必要がありますか?


21

(これは主に、低遅延システムに関する特定の知識を持っている人を対象とし、根拠のない意見で答えるだけの人を避けるためです)。

「いい」オブジェクト指向のコードを書くことと、非常に高速で低レイテンシーのコードを書くことの間にトレードオフがあると思いますか?たとえば、C ++の仮想関数/多態性などのオーバーヘッドを回避する-見た目は悪いが非常に高速なコードを書き換えるなど

それは理にかなっています-maintainいように見える人は誰でも気にしません(メンテナンス可能であれば)-速度が必要な場合、速度が必要ですか?

私はそのような分野で働いた人々から話を聞きたいと思います。


1
@ user997112:近い理由は自明です。:それは言う私たちは、答えは事実、参照、または特定の専門知識でサポートされていることを期待」が、この質問はおそらく要請議論、引数、ポーリング、または拡張の議論になります。 んが、必ずしも彼らにしている正しいを意味するものではありませが、それは近くにありました3人の近い有権者全員が選んだ理由
ロバートハーベイ

逸話的に、私はこの質問が近い票を集めている理由は、それが(私はそうではないと思うが)薄く覆われた暴言として知覚されているかもしれないということだと思います。
ロバートハーヴェイ

8
私は首を突き出します:質問者は彼自身の質問にほとんど答えると思うので、私は3番目の投票を「建設的ではない」として締め切ります。ジョブを実行するのに十分な速度で実行されない「美しい」コードは、遅延要件を満たすことができませんでした。十分な速度で実行される「Uい」コードは、適切なドキュメントを作成することで保守性を高めることができます。美しさやさを測定する方法は、別の質問のトピックです。
Blrfl

1
LMAXのDisruptorのソースコードはそれほど見苦しくありません。「Javaのセキュリティモデルを地獄に落とす」部分(安全でないクラス)とハードウェア固有の修正(キャッシュ行埋め込み変数)がありますが、非常に読みやすいIMOです。
ジェームズ

5
@ Carson63000、user1598390、およびその他の関心のある人:質問が閉じられた場合メタサイトでの閉鎖について気軽に質問してください。コメントで閉鎖、特に起こっていない閉鎖について議論することはほとんど意味がありません。また、すべての閉じられた質問を再び開くことができることに注意してください、それは世界の終わりではありません。もちろん、マヤ人が正しかった場合を除いて、その場合はあなたをすべて知っていてよかったです!
ヤニス

回答:


31

「いい」オブジェクト指向のコードを書くことと、非常に[基本的な]低レイテンシコードを書くこととの間にトレードオフがあると思いますか?

はい。

そのため、「時期尚早な最適化」というフレーズが存在します。開発者にパフォーマンスの測定を強制し、パフォーマンスを向上させるコードのみを最適化する同時に負荷が大きくならないようにアプリケーションアーキテクチャを最初から適切に設計することを目的としています。

そうすれば、可能な限り最大限に、きれいに設計されたオブジェクト指向のコードを維持し、重要な小さな部分のみをoptimizeいコードで最適化できます。


15
「それを機能させ、それから速くしなさい」。この答えは、質問を読んだときに私が言うと思ったことすべてをほぼ網羅しています。
Carson63000

13
私は「推測していない、メジャー」を追加します
マルタインVerburg

1
基本的な作業の回避には、読みやすさを犠牲にしない限り、いくらでも基本的な作業の回避を行う価値があると思います。物事を簡潔で読みやすくし、必要な明白なことだけを行うと、他の開発者のように間接的な長期的なパフォーマンスの勝利が得られます。仕組みについて。
エリックReppen

1
「時期尚早の最適化」-最適化されたコードが最適化されていないコードと同じくらい「いい」場合でも、それは適用されます。ポイントは、スピード/達成する必要のないものを目指して時間を無駄にしないことです。実際、最適化は必ずしも速度に関するものではありません。おそらく、「美」の不必要な最適化などがあります。あなたのコードは、読みやすく、保守可能にするために素晴らしい芸術作品である必要はありません。
Steve314

@ Steve314を2回目にします。私は製品のパフォーマンスリーダーであり、その起源が何らかのパフォーマンス最適化にまでさかのぼることができる、非常に複雑なコードを頻繁に見つけます。コードを単純化すると、多くの場合、パフォーマンスが大幅に向上します。そのような例の1つを単純化すると、パフォーマンスが5倍向上しました(コードの数千行の純削減)。明らかに、誰も実際に測定するのに時間をかけず、おそらく遅いコードと思われるものを時期尚早に最適化しただけです
ブランドン

5

はい、私が提供している例は、C ++対Javaではなく、アセンブリとCOBOLです。

どちらの言語も非常に高速ですが、コンパイルされたCOBOLでさえ、アセンブリ内にそれらの命令を自分で記述するのではなく、必ずしもそこにある必要のない命令セットに配置されるより多くの命令があります。

同じ考えは、C ++で継承/ポリモーフィズムを使用する場合と「 "いコードを作成する」という質問に直接適用できます。endいコードを書く必要があると思います。エンドユーザーが1秒未満のトランザクション時間枠を必要とする場合、プログラマーとしての仕事は、それがどのように発生しても提供することです。

そうは言っても、コメントのリベラルな使用は、コードがどれほどくても、プログラマーの機能と保守性を大幅に向上させます。


3

はい、トレードオフがあります。これにより、より高速でいコードは必ずしも必要ではないことを意味します-「高速コード」からの定量的利益は、その速度を達成するために必要なコード変更の保守の複雑さに対して重み付けする必要があります。

トレードオフは、ビジネスコストから生じます。より複雑なコードには、より熟練したプログラマー(およびCPUアーキテクチャーや設計知識を持つプログラマーなど、より集中したスキルセットを持つプログラマー)が必要であり、コードを読んで理解し、バグを修正するのに時間がかかります。このようなコードの開発と保守にかかるビジネスコストは、通常作成されるコードの10倍から100倍の範囲です。

このメンテナンスコストは、顧客が非常に高速なソフトウェアに非常に高いプレミアムを支払うことをいとわない業界は正当化できます。

いくつかの速度最適化は、他のものよりも優れた投資収益率(ROI)を実現します。つまり、通常のコードと比較して、コードの保守性への影響が少ない(高レベルの構造と低レベルの可読性を維持する)いくつかの最適化手法を適用できます。

したがって、事業主は次のことを行う必要があります。

  • コストとメリットを見て、
  • 測定と計算を行う
    • プログラマーにプログラム速度を測定させる
    • 最適化に必要な開発時間をプログラマに見積もってもらう
    • より高速なソフトウェアによる収益の増加について独自の見積もりを行う
    • ソフトウェアアーキテクトまたはQAマネージャーに、ソースコードの直感性と可読性の低下による欠点を定性的に評価させる
  • そして、ソフトウェアの最適化の低い成果を優先します。

これらのトレードオフは、状況に非常に固有のものです。

これらは、管理者と製品所有者の参加なしには最適に決定できません。

これらはプラットフォームに非常に固有です。たとえば、デスクトップCPUとモバイルCPUでは、考慮事項が異なります。サーバーアプリケーションとクライアントアプリケーションの考慮事項も異なります。


はい、一般に、高速なコードは通常のコードとは異なるように見えます。異なるコードは、読むのに時間がかかります。それがugさを暗示しているかどうかは見る人の目にあります。

私が経験しているテクニックは:(専門知識を要求することなく)ショートベクトル最適化(SIMD)、きめ細かいタスク並列処理、メモリの事前割り当て、オブジェクトの再利用です。

通常、SIMDは、高レベルの構造変更を必要としませんが、APIがボトルネック防止を念頭に置いて設計されている場合でも、低レベルの可読性に重大な影響を与えます。

一部のアルゴリズムは、SIMDに簡単に変換できます(恥ずかしいほどベクトル化可能)。一部のアルゴリズムでは、SIMDを使用するためにより多くの計算の再配置が必要です。波面SIMD並列処理などの極端な場合には、まったく新しいアルゴリズム(および特許可能な実装)を作成して活用する必要があります。

粒度の細かいタスクの並列化では、アルゴリズムをデータフローグラフに再配置し、マージンのメリットが得られなくなるまで、アルゴリズムに機能(計算)分解を繰り返し適用する必要があります。分解されたステージは通常、関数型プログラミングから借用された概念である継続スタイルで連鎖されます。

機能的(計算)分解により、通常は線形で概念的に明確なシーケンス(書き込まれたのと同じ順序で実行可能なコード行)で記述できるアルゴリズムをフラグメントに分解し、複数の関数に分散する必要がありますまたはクラス。(以下のアルゴリズムのオブジェクト化を参照してください。)この変更は、そのようなコードを生じさせた分解設計プロセスに精通していない仲間のプログラマーを大いに妨げます。

このようなコードを保守可能にするには、そのようなコードの作成者は、アルゴリズムの詳細なドキュメントを作成する必要があります。通常のコードに対して行われるコードコメントやUML図の種類をはるかに超えています。これは、研究者が学術論文を書く方法に似ています。


いいえ、高速コードはオブジェクト指向と矛盾する必要はありません。

別の言い方をすれば、オブジェクト指向のままの非常に高速なソフトウェアを実装することが可能です。ただし、その実装の下限(計算の大部分が発生するナットとボルトのレベル)に向かって、オブジェクト設計はオブジェクト指向設計(OOD)から取得した設計から大幅に逸脱する場合があります。下位レベルの設計は、アルゴリズムのオブジェクト化を対象としています。

カプセル化、ポリモーフィズム、合成などのオブジェクト指向プログラミング(OOP)のいくつかの利点は、低レベルのアルゴリズムオブジェクト化から引き続き得られます。これは、このレベルでOOPを使用する主な理由です。

オブジェクト指向設計(OOD)のほとんどの利点は失われます。最も重要なことは、低レベルの設計に直観性がないことです。 仲間のプログラマーは、最初にアルゴリズムがどのように変換および分解されたのかを最初に完全に理解することなく、下位レベルのコードを操作する方法を学ぶことができません。


2

はい、必要な時間で動作させるためにコードが「ugい」場合がありますが、すべてのコードがugい必要はありません。パフォーマンスをテストしてプロファイルを作成してから、「ugい」コードの一部を見つけ、それらのセクションにコメントを付けて、将来の開発者が意図的にいものと怠justだけを知る必要があります。誰かがパフォーマンス上の理由を主張する不十分に設計されたコードをたくさん書いている場合、それを証明させてください。

速度はプログラムの他の要件と同様に重要であり、誘導ミサイルに誤った修正を与えることは、インパクト後に正しい修正を提供することと同等です。保守性は、常に作業コードの二次的な関心事です。


2

私が抽出したいくつかの研究は、きれいで読みやすいコードは、より複雑な読みにくいコードよりも速いことが多いことを示しています。部分的には、これはオプティマイザーの設計方法によるものです。それらは、変数をレジスターに最適化することで、計算の中間結果で同じことを行うよりもはるかに優れている傾向があります。最終結果に至る単一の演算子を使用した割り当ての長いシーケンスは、長く複雑な方程式よりも最適化される場合があります。新しいオプティマイザは、クリーンなコードと複雑なコードの違いを減らしたかもしれませんが、それを排除したとは思いません。

必要に応じて、ループの展開などの他の最適化をクリーンに追加できます。

パフォーマンスを改善するために追加された最適化には、適切なコメントを添付する必要があります。これには、最適化として追加されたステートメントを含める必要があります。できれば、パフォーマンスの前後に測定してください。

80/20ルールは、最適化したコードに適用されることがわかりました。経験則として、少なくとも80%の時間がかかっていないものは最適化しません。その後、10倍のパフォーマンスの向上を目指します(通常は達成します)。これにより、パフォーマンスが約4倍向上します。私が実装したほとんどの最適化は、コードをそれほど「美しく」しませんでした。あなたのマイレージは異なる場合があります。


2

見苦しいということは、他の開発者がそれを再利用したり、理解する必要があるレベルで読んだり理解したりするのが難しいということなら、エレガントで読みやすいコードは、ほとんどの場合最終的にはあなたに維持する必要があるアプリの長期的なパフォーマンスの向上。

それ以外の場合は、キラーインターフェースを備えた美しいボックスにlyいものを入れる価値があるほど十分なパフォーマンスの勝利がありますが、私の経験では、これは非常にまれなジレンマです。

あなたが行くように基本的な仕事の回避について考えてください。パフォーマンスの問題が実際に発生した場合の秘術を保存してください。そして、誰かが特定の最適化に精通しなければ理解できない何かを書かなければならない場合、少なくともあなたのコードの観点を再利用していものを理解しやすくするためにできることをしてください。開発者が次の人が継承しようとしているものについて過度に熱心に考えていたため、悲惨なほど実行するコードはほとんどありませんが、頻繁な変更がアプリ(私の経験ではほとんどのWebアプリ)の唯一の定数である場合、パニック状態の混乱がコードベース全体にポップアップし始めるのを修正するのは困難です。クリーンで無駄のないほうが、長期的にはパフォーマンスに優れています。


2つの変更を提案したいと思います:(1)速度が必要な場所があります。それらの場所では、実装を理解しやすくするよりも、インターフェースを理解しやすくするほうが価値があると思います。後者ははるかに難しいからです。(2)「めったに実行しないコードがそうすることはめったにありません...」と言い直したいと思います。 ...」
rwong

実装は、OOPの会話では不適切な単語の選択でした。再利用と編集のしやすさという意味でした。#2、2が本質的に私が述べていたポイントであることを証明する文を追加しました。
エリックReppen

1

コンプレックス醜いは同じものではありません。多くの特別なケースがあり、パフォーマンスの最後の低下をすべて引き出すように最適化され、最初は接続と依存関係絡み合っているように見えるコードは、実際には非常に慎重に設計されており、一度理解すれば非常に美しくなります。実際、非常に複雑なコードを正当化するのにパフォーマンス(レイテンシーなどで測定される)が十分に重要である場合、コードを適切に設計する必要あります。そうでない場合、その複雑さがすべて単純なソリューションよりも本当に優れているかどうかはわかりません。

Uいコードは、私にとっては、ずさんで、十分に考慮されていない、および/または不必要に複雑なコードです。実行しなければならないコードのこれらの機能が必要になるとは思わない。


1

「いい」オブジェクト指向のコードを書くことと、非常に高速で低レイテンシーのコードを書くことの間にトレードオフがあると思いますか?たとえば、C ++の仮想関数/多態性などのオーバーヘッドを回避する-見た目は悪いが非常に高速なコードを書き換えるなど

私はレイテンシーよりもスループットに少し焦点を当てた分野で働いていますが、それは非常にパフォーマンスが重要であり、「sorta」と言います。

しかし、問題は、非常に多くの人々がパフォーマンスの概念を完全に間違っていることです。初心者は多くの場合、すべてが間違っているだけであり、「計算コスト」の概念モデル全体を修正する必要があります。アルゴリズムの複雑さだけが正しいものです。中間体は多くのことを間違えます。専門家はいくつかの点を間違えています。

キャッシュミスや分岐の予測ミスなどのメトリックを提供できる正確なツールで測定することは、この分野のあらゆるレベルの専門知識を持つすべての人々を抑制し続けるものです。

また、測定は、最適化しないものを指し示します。専門家は、真の測定されたホットスポットを最適化し、遅くなる可能性があるという予測に基づいて暗闇の中で野生の刺し傷を最適化しようとしないため、初心者よりも最適化にかかる時間少なくなります(極端な形では、コードベースの他のすべての行について)。

パフォーマンスのための設計

それはともかく、パフォーマンスのための設計の鍵は、インターフェース設計のように、設計部分にあります。経験不足の問題の1つは、一般的なコンテキストでの間接的な関数呼び出しのコストなど、絶対的な実装メトリックに早期のシフトが生じる傾向があることです。これは、コスト(オプティマイザーの点からすぐに理解した方がよい分岐点ではなくビューの方向)は、コードベース全体で回避する理由です。

コストは相対的です。間接的な関数呼び出しにはコストがかかりますが、たとえば、すべてのコストは相対的です。数百万の要素をループする関数を呼び出すためにそのコストを一度支払う場合、このコストを心配することは、数十億ドルの製品を購入するために何時間も費やして、その製品を購入しないと結論づけるようなものです1ペニー高すぎました。

より粗いインターフェース設計

パフォーマンスのインターフェース設計の側面は、これらのコストをより粗いレベルに押し上げるために、以前より早く追求することがよくあります。たとえば、単一のパーティクルの実行時抽象化コストを支払う代わりに、そのコストをパーティクルシステム/エミッタのレベルに押し上げ、パーティクルを実装の詳細および/またはこのパーティクルコレクションの単純な生データに効果的にレンダリングします。

そのため、オブジェクト指向の設計はパフォーマンスの設計(レイテンシまたはスループット)と互換性がある必要はありませんが、それを重視する言語では、ますます小さな粒状オブジェクトをモデル化する誘惑がある場合があり、最新のオプティマイザーはできません助けて。ソフトウェアのメモリアクセスパターンの効率的なSoA表現を生成する方法で、単一のポイントを表すクラスを結合するようなことはできません。粗さのレベルでモデル化されたインターフェース設計を持つポイントのコレクションは、その機会を提供し、必要に応じてより最適なソリューションに向けて反復することを可能にします。このような設計は、大容量メモリ用に設計されています*。

* ここでは、データではなくメモリに重点を置きます。パフォーマンスが重要な領域で長時間作業すると、データ型とデータ構造のビューが変更され、メモリへの接続方法が表示されるためです。バイナリ検索ツリーは、固定アロケーターの助けを借りない限り、ツリーノードのキャッシュフレンドリとは異なる可能性のあるメモリチャンクなどの場合に、対数の複雑さだけになりません。このビューはアルゴリズムの複雑さを排除しませんが、メモリレイアウトとは独立して表示されなくなります。また、作業の反復は、メモリアクセスの反復に関するものであると見なされ始めます。*

多くのパフォーマンス重視の設計は、実際には、人間が理解して使用しやすい高レベルのインターフェース設計の概念と非常に互換性があります。違いは、このコンテキストでの「高レベル」は、メモリのバルク集約、潜在的に大規模なデータコレクション用にモデル化されたインターフェイス、および非常に低レベルである可能性のある実装に関することです。視覚的なアナロジーは、非常に快適で運転や操作が簡単で、音の速さで非常に安全な車かもしれませんが、ボンネットを開けると、火を吐く悪魔はほとんどいません。

より粗い設計では、より効率的なロックパターンを提供し、コードの並列性を活用するための簡単な方法も得られる傾向があります(マルチスレッドは、ここではスキップしますので、網羅的なテーマです)。

メモリプール

低レイテンシプログラミングの重要な側面は、参照の局所性とメモリの割り当てと割り当て解除の一般的な速度を向上させるために、メモリを非常に明示的に制御することです。カスタムアロケータープーリングメモリは、実際には、説明したのと同じ種類の設計思想を反映しています。バルク用に設計されています。粗いレベルで設計されています。大きなブロックでメモリを事前に割り当て、小さなチャンクですでに割り当てられているメモリをプールします。

アイデアは、高価なものをプッシュすることとまったく同じです(たとえば、汎用のアロケーターに対してメモリチャンクを割り当てる)。メモリプールは、メモリを一括処理するために設計されています。

タイプシステム分離メモリ

任意の言語での粒度の高いオブジェクト指向設計の難しさの1つは、多くの小さなユーザー定義型とデータ構造を導入したいということです。これらのタイプは、動的に割り当てられた場合、小さな塊で割り当てられます。

C ++の一般的な例は、ポリモーフィズムが必要な場合で、自然な誘惑はサブクラスの各インスタンスを汎用メモリアロケーターに割り当てることです。

これにより、連続する可能性のあるメモリレイアウトがアドレス範囲全体に散らばる小さなビット単位のビットと断片に分割され、ページフォールトとキャッシュミスが増加します。

低遅延でスタッターのない決定論的応答を必要とする分野は、ホットスポットが常に単一のボトルネックに沸騰するわけではない場所であり、小さな非効率性が実際に「蓄積」(多くの人が想像するもの)することができますプロファイラーでそれらをチェックしておくのは間違っていますが、遅延駆動型のフィールドでは、実際には小さな非効率性が蓄積するまれなケースがあります)。そして、そのような蓄積の最も一般的な理由の多くは、これである可能性があります:いたるところにメモリの小さなチャンクの過剰な割り当て。

Javaのような言語では、たとえば、int(しかしまだかさばる高レベルインターフェイスの背後にある)配列などのボトルネックのある領域(タイトループで処理される領域)に対して、可能な限り単純な古いデータ型の配列を使用すると便利です、ArrayListユーザー定義のIntegerオブジェクト。これにより、通常、後者に伴うメモリ分離が回避されます。C ++では、メモリ割り当てパターンが効率的であれば、ユーザー定義型を連続的に割り当てることができ、汎用コンテナのコンテキストでさえ割り当てることができるため、構造をそれほど劣化させる必要はありません。

メモリーの融合

ここでの解決策は、同種のデータ型、場合によっては同種のデータ型のカスタムアロケータに到達することです。小さなデータ型とデータ構造がメモリ内のビットとバイトにフラット化されると、それらは同種の性質を帯びます(アライメント要件は多少異なりますが)。メモリ中心の考え方からそれらを見ていない場合、プログラミング言語の型システムは、潜在的に隣接するメモリ領域を小さなちらつきの小さなチャンクに分割/分離したいです。

スタックはこのメモリ中心のフォーカスを利用してこれを回避し、潜在的にその中にユーザー定義型インスタンスの可能な組み合わせを格納します。スタックを最大限に活用することは可能な限り優れたアイデアであり、その最上部はほとんど常にキャッシュラインにありますが、LIFOパターンなしでこれらの特性の一部を模倣するメモリアロケーターを設計し、異なるデータ型にまたがるメモリを隣接するように融合することもできますより複雑なメモリ割り当ておよび割り当て解除パターンでもチャンク。

最新のハードウェアは、連続するメモリブロックを処理するとき(同じキャッシュライン、同じページなどに繰り返しアクセスするとき)にピークに達するように設計されています。隣接するキーワードは、関心のある周辺データがある場合にのみ有益であるため、連続性があります。そのため、パフォーマンスの鍵(多くの場合、難易度も)は、分離されたメモリチャンクを、エビクション前に全体(関連するすべてのデータ)にアクセスされる連続したブロックに再び融合することです。プログラミング言語の特にユーザー定義型のリッチ型システムはここでの最大の障害になる可能性がありますが、必要に応じてカスタムアロケーターおよび/またはかさばる設計を介して常に問題に対処し、解決できます。

醜い

「Uい」と言うのは難しいです。これは主観的な指標であり、パフォーマンスが非常に重要な分野で働く人は、「美」の考え方をよりデータ指向であり、物事を一括処理するインターフェイスに焦点を当てるものに変え始めるでしょう。

危険な

「危険」の方が簡単かもしれません。一般に、パフォーマンスは低レベルのコードに到達する傾向があります。たとえば、メモリアロケータの実装は、データ型の下に到達し、生のビットとバイトの危険なレベルで作業しないと不可能です。その結果、これらのパフォーマンスクリティカルなサブシステムでの慎重なテスト手順への焦点を高め、最適化のレベルを適用してテストの徹底を拡大するのに役立ちます。

美人

しかし、これらはすべて実装の詳細レベルにあります。ベテランの大規模でパフォーマンス重視の考え方の両方において、「美」は実装の詳細よりもインターフェース設計に移行する傾向があります。インターフェースの設計変更に伴い発生する可能性のある結合やカスケードの破損により、実装よりも「美しく」、使用可能で、安全で、効率的なインターフェースを探すことが、指数関数的に高い優先度になります。実装はいつでも交換できます。通常、必要に応じて、また測定で指摘されているように、パフォーマンスに向かって反復します。インターフェース設計の鍵は、システム全体を破壊することなく、そのような反復の余地を残すために十分に粗いレベルでモデリングすることです。

実際、ベテランのパフォーマンスクリティカルな開発への焦点は、多くのパフォーマンスを持つ大規模なコードベースなので、安全性、テスト、保守性、SEの弟子に重点を置く傾向があることを示唆します。 -重要なサブシステム(パーティクルシステム、画像処理アルゴリズム、ビデオ処理、オーディオフィードバック、レイトレーサー、メッシュエンジンなど)は、メンテナンスの悪夢にdrれるのを防ぐために、ソフトウェアエンジニアリングに細心の注意を払う必要があります。多くの場合、驚くほど効率の良い製品でもバグの数が最も少ないのは偶然ではありません。

TL; DR

とにかく、それは、真にパフォーマンスが重要な分野の優先順位から、待ち時間を短縮し、わずかな非効率性を蓄積させるもの、実際に「美しさ」を構成するもの(最も生産的に見た場合)に至るまで、私がテーマに取り組んでいます。


0

違いはありませんが、ここに私がしていることを示します:

  1. きれいで保守しやすいように書いてください。

  2. 行い、性能診断を、そして、それはあなたを伝えるの問題、あなたは推測していないものを修正。保証されており、予想とは異なります。

これらの修正は、まだ明確で保守可能な方法で行うことができますが、コメントを追加して、コードを見る人がなぜそのようにしたのかを知る必要があります。そうしないと、彼らはそれを元に戻します。

トレードオフはありますか?私は本当にそうは思いません。


0

非常に高速ないコードを書くことができ、andいコードと同じくらい速い美しいコードを書くこともできます。ボトルネックは、コードの美しさ/組織/構造ではなく、選択した技術にあります。たとえば、非ブロッキングソケットを使用していますか?シングルスレッド設計を使用していますか?スレッド間通信にロックフリーキューを使用していますか?GC用のゴミを生成していますか?重要なスレッドでブロッキングI / O操作を実行していますか?ご覧のとおり、これは美しさとは関係ありません。


0

エンドユーザーにとって重要なのは何ですか?

  • 性能
  • 特徴/機能
  • 設計

ケース1:不良コードの最適化

  • ハードメンテナンス
  • オープンソースプロジェクトとしては読みにくい

ケース2:最適化されていない良好なコード

  • 簡単なメンテナンス
  • ユーザーエクスペリエンスが悪い

溶液?

簡単でパフォーマンスが重要なコードを最適化

例えば:

5つのメソッドで構成されるプログラム、そのうちの3つはデータ管理用、1つはディスク読み取り用、もう1つはディスク書き込み用

これら3つのデータ管理方法は、2つのI / O方法を使用し、それらに依存しています

I / Oメソッドを最適化します。

理由: I / Oメソッドは変更される可能性が低く、アプリのデザインにも影響を与えません。すべての場合、そのプログラムのすべてがそれらに依存しているため、パフォーマンスが重要であると思われます。 。

これは、コードの特定の部分を最適化することでプログラムを高速に保ちながら、適切なコードとプログラムの管理可能な設計を取得することを意味します

私は考えています..

悪いコードは人間が磨き上げて最適化するのを難しくし、小さな間違いはそれをさらに悪化させるかもしれないので、初心者/初心者にとって良いコードは、そのいコードをうまく書けば良いでしょう。

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