問題タブ [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.
.net - IDictionaryのパフォーマンスvs汎用Typeプロパティ
編集:私はこの質問を誤った仮定に基づいています-私が行っていたジェネリック型インスタンスのルックアップは、実行時に作成されたジェネリック型で行われた場合と同じ作業になるということです。私のハーネスにあるものはコンパイラーがアクセスできるので、アドレスルックアップにコンパイルできます。.MakeGenericTypeが舞台裏で何をするのかまだかなり興味があります。
IDictionaryから値を取得することと、静的プロパティを持つ汎用型から値を取得することを簡単に比較しました。
100000000ルックアップの結果:
辞書:14.5246952一般的なタイプ:00.2513280
.NETは、Genericのインスタンスにすばやくマップするために、バックグラウンドでどのような魔法を使用していますか?ルックアップにはハッシュテーブルに似たものを使用する必要があると思いました。多分それはJITTEDになります...私は知りません!あなたは?
これが私のテストハーネスです-間違いだらけだと思いますので、修正が必要なものを教えてください!
go - golang でスライスを回転させる効率的な方法
golang でスライスを効率的に反転する関数が必要です。(私の具体的な必要性は、[] バイトのプレフィックスを逆にすることです)。
私はEffective Goの例をobjdump -Sd
チェックしました.配列インデックスをチェックするために多くのボイラープレートが生成されます. スワップでさえ非効率的です。
java - Java-forループで変数を宣言する
ループ内で変数を宣言するのは悪い習慣ですか?以下の最初のコードブロックに見られるように、そうすると、ループの各反復で新しい文字列が作成されるため、2番目のメモリの10倍のメモリが使用されるように思われます。これは正しいです?
対。
javascript - ローカル関数を持っていないのはマイクロ最適化ですか?
関数が呼び出されるたびにマイクロ最適化が作成されないように、内部関数をこの関数の外に移動しますか?
この特定のケースでは、doMoreStuff
関数は 内でのみ使用されdoStuff
ます。このようなローカル関数を持つことについて心配する必要がありますか?
実際の例は次のようになります。
loops - forループまたはwhileループのどちらが速いですか?
重複の可能性:
どのループがより高速であるか、
forループとwhileループを同じ目的で使用できます。
例:アイテムを1000000000回ループしたいのですが、forループまたはwhileループを使用しますか?
それは反復ですが、プログラミングで両方が必要なのはなぜですか?
両方のループが同じように機能しているのに、なぜ両方が必要なのですか?
c++ - C++固定サイズ配列と同じタイプの複数のオブジェクト
(明らかな構文の違いは別として)オブジェクトの複数のインスタンス(同じタイプ)を含むクラスと、そのタイプのオブジェクトの固定サイズの配列との間に効率の違いがあるかどうか疑問に思いました。
コード内:
実際には、Cスタイルの配列よりも優れたC++の代替であるboost::arraysを使用します。
これらのクラスは、メンバー関数の1つを一度呼び出すだけで作成されることが多いため、私は主に構築/破棄とそのようなdoubleの読み取り/書き込みに関心があります。
あなたの助け/提案をありがとう。
java - Javaのプライベート内部クラスにパフォーマンスのオーバーヘッドはありますか?
プライベートメソッドまたはフィールドを持つ内部クラスがある場合、コンパイラは、外部クラスがそれらのプライベート要素にアクセスできるようにするために、パッケージで保護された合成アクセサメソッドを作成する必要があります(その逆も同様です)。
それを避けるために、私は通常、すべてのフィールドとメソッドおよびコンストラクターをプライベートではなくパッケージで保護します。
しかし、クラス自体の可視性はどうですか?にオーバーヘッドはありますか
対
どちらの場合もコンストラクターはパッケージで保護されていることに注意してください。それとも、クラスをプライベートにすると変更されますか?
c - 同じオフセットでの2つのintのいくつかのニブルの高速検索(C、マイクロ最適化)
私の仕事はチェック(>兆チェック)です。2つのintには、事前定義されたニブルのペア(最初のペアは0x2 0x7、2番目のペアは0xd 0x8)が含まれていますか。例えば:
したがって、この例では、必要なペアで2つのオフセットをマークします(オフセットは2と5ですが、7ではありません)。実際のオフセットと見つかったペアの数は、私のタスクでは必要ありません。
したがって、与えられた2つのintについて、問題は次のとおりです。同じオフセットにこれらのニブルのペアのいずれかが含まれていますか。
私は自分のプログラムをチェックしました。この部分は最もホットな場所です(gprof
証明済み)。そしてそれは非常に何度も呼ばれます(gcov
証明されています)。実際には、ネストされたループの3番目または4番目のループ(最もネストされたループ)です。
私の現在のコードは遅いです(私はそれを関数として書き直しますが、それは内部ループからのコードです):
もう1つのタスクは、オフセット0、4、8ビットなどだけでなく、オフセット0、2、4、8、10、...ビットでもこのペアを見つけることです。
この関数とマクロを並行して書き直すことは可能ですか?
私のコンパイラはgcc452で、CPUは32ビットモード(x86)のIntelCore2Soloです。
c - すべての辞書式連続番号のループ
first
長さ(<32) の特定のビット ベクトルについてbitnum
、同じ長さのすべての辞書式連続ビット ベクトルを反復処理する必要があります。
たとえば、first
011001 (バイナリ) でbitnum
6 の場合、連続するものはすべて 011011、011101、011111、111001、111011、111101、111111 です。また、011001 も繰り返す必要があります。
私が辞書編集的連続を意味するもの:
- の i 番目のビット
first
が「1」の場合、の i 番目のビットは「1」でnext
なければなりません - の i 番目のビット
first
が「0」の場合、の i 番目のビットはnext
「0」または「1」になります。
そのようなビットベクトルを生成する最速の方法は何ですか?
今、私はこの最適化されていないコードを使用します。可能なすべてのビットベクトルを生成することで機能し、すべてのベクトルがfirst
辞書式の方法で指定されているかどうかを確認します。
コードが連続するビットベクトルのみを生成する場合、より高速になると思います。
First
ベクトルは、このビット長の任意のベクトルです。
生成されたベクトルの順序は異なる場合があります。
この関数またはそのバージョンのベンチマークを実行する場合は、小さなベンチマーク ツールがあります。ループを追加するだけです。関数コード:
たとえば、bitnum=16 の場合、このコードは PC で 6 秒間実行されます。この関数を、最大 31 までのより高いビット数で使用する必要があります。
最適化を手伝ってくださいloop_over_all_lex_succ
。
c - Cコンパイラはインライン関数のアドレスを最適化できますか?
次のコードがあるとしましょう:
繰り返されるコードを別の関数に抽象化すると、次のようになります。
コンパイラーが関数をインライン化し、結果のコードのchange_locals
ようにを最適化することを期待します。*(&foo)++
foo++
私の記憶が正しければ、ローカル変数のアドレスを取得すると、通常、一部の最適化が妨げられます(たとえば、レジスタに格納できません)が、アドレスに対してポインタ演算が行われず、関数からエスケープされない場合、これは適用されますか?が大きい場合、 (MSVCで)change_locals
宣言された場合に違いがありますか?inline
__inline
特にGCCおよびMSVCコンパイラの動作に興味があります。