問題タブ [micro-optimization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - リテラルの重複とハードコーディング
次のパターンが非常に頻繁に発生しています。
リテラル文字列が 2 回使用されていることに注意してください。抜粋は nginx ソースベースからのものです。
コンパイラは、コンパイル単位内でこれらのリテラルが検出されたときに、これらのリテラルをマージできる必要があります。
私の質問は次のとおりです。
- 商用グレードのコンパイラ (VC++、GCC、LLVM/Clang) は、コンパイル ユニット内で発生したときにこの冗長性を取り除きますか?
- (静的) リンカは、オブジェクト ファイルをリンクするときにそのような冗長性を取り除きますか?
- 2 が適用される場合、動的リンク中にこの最適化が行われますか?
- 1 と 2 が当てはまる場合、それらはすべてのリテラルに当てはまりますか。
これらの質問は、プログラマーが効率を失うことなく冗長にできるため、重要です。つまり、プログラムに組み込まれている膨大な静的データ モデル (たとえば、低レベルのシナリオで使用される意思決定支援システムのルール) について考えることができます。 .
編集
2 点 / 説明
上記のコードは、認められた「マスター」プログラマーによって書かれています。男は片手でnginxを書きました。
リテラル ハードコーディングの可能なメカニズムのどれが優れているかは尋ねていません。したがって、話題を逸らさないでください。
編集 2
私の元の例は、非常に不自然で制限的でした。次のスニペットは、内部のハードコーディングされた知識に埋め込まれている文字列リテラルの使用法を示しています。最初のスニペットは、構成パーサーがどの文字列にどの列挙値を設定するかを伝えるためのものであり、2 番目のスニペットは、より一般的にプログラム内の文字列として使用されるためのものです。個人的には、コンパイラが文字列リテラルの 1 つのコピーを使用し、要素が静的であるため、グローバル シンボル テーブルに入らない限り、これで満足しています。
密接に続く:
話題にとどまった人たち、ブラボー!
assembly - PF (パリティ フラグ) をクリアする 1 つの命令 -- 結果レジスタに奇数ビットを取得
x86 アセンブリでは、任意の初期レジスタ構成で動作する 1 つの命令のみでパリティ フラグをクリアできますか?
これは、フラグを設定する任意の操作 (明示的に を除く) で、ビット数が奇数mov
の結果レジスタを作成することと同じです。
対照的に、パリティ フラグの設定は 1 つの命令で実行できます。
また、次の 2 つの命令でパリティ フラグをクリアする方法は多数あります。
ただし、1 命令の方法はとらえどころのないままです。
assembly - Intel8086アセンブリ-レジスタの2乗
原則として、レジスタの値を2乗することは難しくありません。
しかし、私は考え始めました-私が賞の効率のためにアセンブリを非常に高く学んでいるコース。1行少ない差でも最大5ポイントの価値があります。
これはマイクロ最適化だと思いますが、次のコードは同じように実行されますか?:
私の質問を表現するもっと簡単な方法だと思います:AX(またはAL / AH)は8086アセンブリのmul
andコマンドの有効なパラメータですか?imul
c# - どのメソッド実装がより速く実行されるかをテストする方法
入力が文字列のタイプであるかどうかの質問チェックが閉じられている間、2つの答えが私の心の中でマイクロ最適化の質問を引き起こしました:以下の2つの解決策のどちらがより良いパフォーマンスを発揮しますか?
Reed Copseyは、以下を使用してソリューションをChar.IsLetter
提供しました。
Mark Byersの正規表現を使用した適応ソリューション:
リードとマークのどちらかに質問したくないので、どちらが優れているかを判断するための簡単なテストを作成すると思いました。問題は、コードの最適化をあまり行っていないことです(コードの可読性を何よりも優先する傾向があります)。
それぞれの実行の前後にタイムスタンプを取得する以外に、どのソリューションがより高速に実行されるかを決定する他の(より良い?)オプションは何ですか?
編集
Martinの回答を修正Console.WriteLine(...)
して、コンソールアプリケーションとして実行しました。LinqPadがアプリケーションを実行する方法は正確にはわかりませんが、結果はほぼ同じでした。
c - 2つのループ本体を使用しますか、それとも1つを使用しますか(結果は同じです)?
CPUキャッシュ(参照の局所性の恩恵を受けることが知られている)をより有効に活用することに関して、何がより効率的であるかを長い間疑問に思っていました-それぞれが同じ数学的な数値のセットを繰り返し、それぞれが異なる本文ステートメントを持つ2つのループ(たとえば、セットの各要素の関数を呼び出す)、または2つ(またはそれ以上)のbodyステートメントと同等のbodyを持つ1つのループを持つ。すべてのループの後、同じアプリケーション状態を想定しています。
私の意見では、ループで使用される命令とデータがキャッシュに収まるため、ループが2つあると、キャッシュミスとエビクションが少なくなります。私は正しいですか?
仮定:
ループのコストと比較して
f
、呼び出しのコストはごくわずかです。g
f
キャッシュの大部分をそれぞれ単独でg
使用するため、キャッシュが次々に呼び出されたときにキャッシュが流出します(シングルループバージョンの場合)Intel Core Duo CPU
C言語のソースコード
GCCコンパイラ、「余分なスイッチなし」
可能であれば、「時期尚早の最適化は悪」という性格以外の答えが欲しい。
私が提唱している2ループバージョンの例:
java - これら2つのJavaセグメントのパフォーマンスに違いはありますか?
これらの2つのJavaメソッド呼び出しのいずれかが、プロセッサ時間、メモリ割り当て、ガベージコレクションの点でまったく異なる動作をするかどうかを知りたいです。
対。
c++ - ループ速度に関する質問
次の2つのループがあります。
私はそれを3回実行しました。最初の2回の実行では、2番目のループが最速でしたが、3回目の実行では、最初のループが最速でした。これは何を意味するのでしょうか?どちらが良いですか?状況次第ですか?
c# - ルックアップの最適化
値を検索するために使用する配列があります。最初の 2 つの値を使用して n 行を取得します。たとえば、最初の列に 2 があり、2 番目の列に 7 があるすべての行。 これらの値を取得するための最速の (マイクロ最適化を意味する) 方法は何ですか? for ループを使用して値を取得します。
編集: 約60行しかありません。3 つのネストされた配列を作成して、最初の 2 列を t[2][7] のように直接インデックスとして使用できるようにすると、本当に必要な行だけを反復処理できます。それはより速いでしょうか?
テーブル:
sql - 全文検索用に最適化された2番目の列を作成することに意味はありますか?
私が取り組んでいるプロジェクトには、検索する必要のある列ごとに、FULLTEXTインデックスを持つ「ft[columnname]」という2番目の列があり、この列のみが検索されます。
この列には、次の方法で元の列から自動的に生成される「最適化された」テキストが含まれています。
- 文字列は小文字です
- すべてのアクセントが削除されます
- すべての句読点と検索できない文字が削除されます
- 重複した単語はすべて削除されます
- すべての単語は、長いものから短いものへと並べ替えられます
- 私が本当に理解していない他の変換(結合された単語に関連する)
たとえば、「私はポケモン、特にピカチュウが好きです!」「特に私のようなポケモンピカチュウ」になります。
(非常に小さなものでも)パフォーマンス上の利点はありますか?データベース内のデータが動的に変更されることはありません。
c - マイクロ最適化: フラグ/ブール型に intptr_t を使用
私が理解していることから、 intptr_t の定義はアーキテクチャによって異なります-プロセスのすべての均一なアドレス空間にアクセスできるポインターを表す能力があることが保証されています。
Nginx (人気のあるオープン ソース Web サーバー) は、フラグ (ブール値) として使用される型を定義し、これは への typedefintptr_t
です。例として x86-64 アーキテクチャを使用すると、すべてのサイズのオペランドをカバーする大量の命令にアクセスできますが、なぜフラグを intptr_t に定義するのでしょうか。確かに、32 ビットの bool 型を使用するという伝統も同様に法案に適合するでしょうか?
私は32ビットのVを超えました。私が新しい開発者だったとき、8 ビット bools は自分自身を議論し、結論は、プロセッサ設計の複雑さのために、一般的なケースでは 32 ビット bool の方がパフォーマンスが優れているというものでした。では、なぜ 64 ビット bools に移行する必要があるのでしょうか?