問題タブ [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++ - 空のクラスのコンストラクターを呼び出すと、実際にメモリが使用されますか?
私が次のようなクラスを持っているとしましょう
そして、私はそれを使用してそれを呼び出します
これにより、「空の」オブジェクトを作成するためにスタックにメモリが割り当てられますか?明らかに、引数はスタックにプッシュする必要がありますが、余分なオーバーヘッドは発生しません。基本的に私はコンストラクターを静的メンバーとして使用しています。
私がこれをしたい理由はテンプレートのためです。実際のコードは次のようになります
これで私は次のようなものを書くことができます
のタイプを指定する必要がなく、1つのテンプレートパラメータを特殊化できるようにしますT
。また、コンパイラーがコンストラクター内の他のブランチを最適化することを望んでいます。これが本当かどうか、またはチェックする方法を誰かが知っているなら、それは大いにありがたいです。また、テンプレートをその状況に投げても、「空のクラス」の問題は上から変わらないと思いましたよね?
c++ - アセンブリリストを分析して、gcc /g++でのコンパイラの最適化を検証します
コンパイラが特定のC++コードを最適化する方法に関する質問をしたところ、コンパイラが特定の最適化を実行したことを確認する方法についての質問を探していました。g ++()で生成されたアセンブリリストを調べて、内部でg++ -c -g -O2 -Wa,-ahl=file.s file.c
何が起こっているかを確認しようとしましたが、出力がわかりにくいです。この問題に取り組むために人々はどのようなテクニックを使用しますか?また、この問題について話しているGCCツールチェーンに固有の最適化されたコードまたは記事のアセンブリリストを解釈する方法に関する良い参考資料はありますか?
c - CPU-コアスレッド分類機能
プロセス間の超大量のメッセージ配信のためのマルチスレッド共有メモリメッセージングシステムを作成します。メッセージは、Webサーバーのワーカースレッドから発信されます。同じCPU共有をコアとするCPUキャッシュの局所性を活用したいと思います。そのため、このIPCシステムの受信側でワーカースレッドをウェイクアップするときに、同じCPUでスレッドをウェイクアップします。
Linux(一般的にはPOSIX)とWindowsが必要です。API呼び出しとビットマスキングを使用して、実行中のスレッドIDを分類できるようにする情報を抽出します。このスレッドのコンテキストから次の構造体を使用します。 :
両方のプラットフォームの機能が高く評価されます。これがシステムコール、つまりコンテキストスイッチなしで実行できることを望んでいます。
- 編集 -
現在はx86に焦点を当てていますが、他のアーキテクチャも同様に役立つでしょう。
c - Cでのマイクロ最適化、どれがありますか?本当に役に立つ人はいますか?
私はそこにあるほとんどのマイクロ最適化を理解していますが、それらは本当に役に立ちますか?
例:++i
の代わりに実行するi++
か、while(1)
またはfor(;;)
実際にパフォーマンスの向上(メモリフィンガープリントまたはCPUサイクルのいずれか)をもたらしますか?
だから問題は、Cでどのようなマイクロ最適化を行うことができるかということです。それらは本当に便利ですか?
.net - .Netに「ペイロード」値のない辞書
ときどき、値のセットで重複するIDをチェックする必要があります。通常、このためにディクショナリを使用します。キーだけを使用し、値は空のままにします。
これはタイトで高度に最適化されたコードであることに注意してください。「時期尚早の最適化」を叫ばないでください。CPUとRAMが限界まで圧迫されているシナリオを想定して、私はより最適なソリューションについて意見を集めたいと思っていました。おそらく、Lookupクラスのようなものは、不要なRAM割り当てを回避するため、わずかに高速になります。そのようなクラスはサードパーティですか、それとも私がBCLで見落としているクラスがありますか?
グーグルが高速とコンパクトの両方の辞書クラスのコードをリリースしたことを理解しています-おそらくそこにC#/。Netに移植できるものがありますか?
ありがとう。
jquery - JQuery:私の「スクロール」イベントは非常に遅いです。私は何が間違っているのですか?
これらのdivの1つをスクロールしたときにDIV
、イベントを発生させたい4つがあります。scroll
これは以下のコードです。
Firefox / Chromeでは、これは高速に実行されます。ただし、Internet Explorerでは、これは非常に遅いため、実際にはdivをスクロールできません。
最新バージョンのJQuery(v.1.4.1)を使用しています。
質問:上記のコードを実行するためのより効果的な方法はありますか?もしそうなら、どのように?
更新:質問されたので、コード全体を以下に含めました:
更新2:
だから私は以下のタイマーオプションを実装しました、そしてIEではそれはまだ同じくらい遅いです。他のアイデアはありますか?
performance - 2 ^ kである数値のlg2を取得する方法
2 の累乗であることがわかっている数値の 2 を底とする対数を取得するための最適なソリューションは何ですか ( 2^k
)。(もちろん、私はそれ自体では2^k
なく値だけを知っていk
ます。)
私が考えた 1 つの方法は、1 を減算してからビットカウントを行うことです。
しかし、(キャッシュなしで)それを行うより速い方法はありますか?また、ビットカウントがそれほど速くないことを知っておくといいですか?
これは次のアプリケーションの 1 つです。
キャッシュなしでbitcountよりも高速であるためO(lg(k))
にk
は、ストレージ ビットのカウントよりも高速である必要があります。
c - 数が偶数か奇数かを見つける最も速い方法は何ですか?
数が偶数か奇数かを見つける最も速い方法は何ですか?
c# - 条件演算子は遅いですか?
私は、それぞれの場合に巨大なswitchステートメントとif-elseステートメントを含むコードを見ていて、すぐに最適化の衝動を感じました。優れた開発者として、私は常にいくつかの難しいタイミングの事実を把握するために着手し、3つのバリエーションから始めるべきです。
元のコードは次のようになります。
/li>条件演算子を使用するように変換された2番目のバリアント:
/li>キーと文字のペアが事前に入力された辞書を使用したひねり:
/li>
注:2つのswitchステートメントの大文字と小文字はまったく同じであり、辞書の文字数は同じです。
1)と2)のパフォーマンスは多少似ており、3)は少し遅くなると予想していました。
ウォームアップのために10.000.000回の反復を2回実行してから時間を計った各メソッドについて、驚いたことに、次の結果が得られました。
- 呼び出しあたり0.0000166ミリ秒
- 呼び出しあたり0.0000779ミリ秒
- 呼び出しあたり0.0000413ミリ秒
どうすればいいの?条件演算子は、if-elseステートメントよりも4倍遅く、辞書検索よりもほぼ2倍遅くなります。ここで重要な何かが欠けていますか、それとも条件演算子は本質的に遅いですか?
アップデート1:私のテストハーネスについて一言。Visual Studio2010のリリースコンパイル済み.Net3.5プロジェクトで、上記の各バリアントに対して次の(擬似)コードを実行します。コードの最適化がオンになり、DEBUG/TRACE定数がオフになります。時間指定の実行を行う前に、ウォームアップのために測定中のメソッドを1回実行します。shift
runメソッドは、trueとfalseの両方に設定され、入力キーの選択セットを使用して、メソッドを多数の反復で実行しました。
Runメソッドは次のようになります。
アップデート2:さらに掘り下げて、1)と2)で生成されたILを調べたところ、メインのスイッチ構造は予想どおりに同じであることがわかりましたが、ケース本体にはわずかな違いがあります。これが私が見ているILです:
1)if / elseステートメント:
2)条件演算子:
いくつかの観察:
- 条件演算子は、
shift
trueに等しい場合は分岐し、if/elseshift
はfalseの場合に分岐します。 - 1)は実際には2)よりもいくつかの命令にコンパイルされます
shift
が、がtrueまたはfalseの場合に実行される命令の数は、2つで同じです。 - 1)の命令順序は、常に1つのスタックスロットのみが占有され、2)は常に2つをロードするようになっています。
これらの観察結果のいずれかは、条件演算子のパフォーマンスが遅くなることを意味しますか?関係する他の副作用はありますか?
performance - ループのアンローリングがまだ役に立つのはいつですか?
私は、パフォーマンスが非常に重要なコード (モンテカルロ シミュレーション内で何百万回も呼び出されているクイック ソート アルゴリズム) をループ展開によって最適化しようとしています。高速化しようとしている内部ループは次のとおりです。
私は次のようなものに展開しようとしました:
これはまったく違いがなかったので、より読みやすい形式に戻しました。ループのアンローリングを試みたときも、同様の経験がありました。最新のハードウェアの分岐予測子の品質を考えると、ループの展開が依然として有用な最適化になるのはいつですか?