問題タブ [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.
java - ' ... != null' または 'null != ....' 最高のパフォーマンス?
そこのパフォーマンスをチェックする2つの方法を書きました
コンパイル後にバイトコードであることを確認しました
ここでは、if 条件を実装するために 2 つのオペコードが使用されます。最初のケースでは、ifnull を使用します- スタックの一番上の値が null であることを確認します- 2 番目のケースでは、if_acmpeq を使用します- スタックで上の 2 つの値が等しいことを確認します-
それで、これはパフォーマンスに影響を与えますか?(これは、null の最初の実装がパフォーマンスと読みやすさの面で優れていることを証明するのに役立ちます:))
javascript - Javascriptスコープチェーン
プログラムを最適化しようとしています。閉鎖の基本は理解できたと思います。しかし、スコープチェーンについては混乱しています。
一般に、スコープを低くする必要があることはわかっています(変数にすばやくアクセスするため)。
次のオブジェクトがあるとします。
私の理解では、some_publicメソッドを使用している場合、パブリック変数よりも高速にプライベート変数にアクセスできます。これは正しいです?
私の混乱は、これのスコープレベルにあります。
コードがデバッガーで停止すると、firebugはthisキーワード内のパブリック変数を表示します。この単語はスコープレベル内にありません。
これにアクセスする速度はどれくらいですか?現在、this.propertiesを別のローカル変数として保存して、何度もアクセスしないようにしています。
どうもありがとう!
assembly - x86 opcode アライメントのリファレンスとガイドライン
JIT コンパイラでいくつかのオペコードを動的に生成しており、オペコードの配置に関するガイドラインを探しています。
1) 呼び出しの後に nops を追加することで、アライメントを簡単に「推奨」するコメントを読みました
2)並列処理のためにシーケンスを最適化するために nop を使用することについても読みました。
3) ops のアラインメントが「キャッシュ」のパフォーマンスに適していることを読みました
通常、これらのコメントは裏付けとなる参照を提供しません。ブログやコメントを読んで、「これを行うのは良い考えだ」と言うのと、特定の op シーケンスを実装するコンパイラを実際に書いて、オンラインのほとんどの資料、特にブログが役に立たないことに気付くのとは別のことです。実用化のために。だから私は自分で物事を見つけることを信じています(実際のアプリが何をするかを見るために逆アセンブルなど)。これは、外部情報が必要な 1 つのケースです。
コンパイラは通常、前の命令シーケンスの直後に奇数バイトの命令を開始することに気付きました。そのため、ほとんどの場合、コンパイラは特別な注意を払っていません。あちこちで「nop」を見かけますが、通常、nop は控えめに使用されているようです。オペコードのアライメントはどの程度重要ですか? 実際に実装に使える事例を参考にしていただけないでしょうか?ありがとう。
java - Javaでパラメータ化されたArrayListsのジェネリック配列?
私はJavaを初めて使用するので、本質的な問題に気づいていません。
パラメータ化されたArrayListのジェネリック配列を作成できないのはなぜですか?
代わりに私は書かなければなりません、
または、ArrayListsのリストを作成する必要があります。
配列はArrayListsよりも効率的であると考えられていませんか?では、なぜJavaはそれを許可しないのでしょうか。
また、次の2行の違いは何ですか。
java - 長さ - 1 までカウントアップするのとは対照的に、ゼロまでカウントダウンする
長さ - 1 までカウントアップするのではなく、長さ - 1 からゼロまで小さなループで (可能な場合) カウントすることをお勧めしますか?
1.) カウントダウン
2.) カウントアップ
最初のものは2番目のものよりもわずかに高速ですが(ゼロと比較する方が速いため)、私の意見ではエラーが発生しやすくなっています。さらに、最初のものは、JVM の将来の改善によって最適化されない可能性があります。それに関するアイデアはありますか?
python - Python の例外ハンドラのコスト
別の質問で、受け入れられた回答は、パフォーマンスを向上させるために、Python コードの (非常に安価な) if ステートメントを try/except ブロックに置き換えることを提案しました。
コーディング スタイルの問題はさておき、例外が決してトリガーされないと仮定すると、例外ハンドラーがある場合とない場合、またはゼロと比較する if ステートメントがある場合とでは、(パフォーマンスに関して) どのくらいの違いがありますか?
java - Java >>と>>>の右シフト演算子の間でパフォーマンスが異なることはありますか?
Javaの>>(符号付き)と>>>(符号なし)の右ビットシフト演算子のパフォーマンスが異なると考える理由はありますか?自分のマシンで違いを検出できません。
これは純粋に学術的な質問です。それがボトルネックになることは決してないだろうと私は確信しています。私は知っています:あなたが何を意味するのかを何よりも書くのが最善です。たとえば、2で除算するには>>を使用します。
どのアーキテクチャがどの操作を命令として実装しているかにかかっていると思います。
c++ - タイトな内部ループから小さな関数を呼び出すオーバーヘッド? 【C++】
次のようなループが表示されたとします。
これが Java の場合は、おそらくよく考えないと思います。しかし、C ++のパフォーマンスが重要なセクションでは、それをいじくり回したくなります...しかし、コンパイラがそれを無駄にするほど賢いかどうかはわかりません。これは架空の例ですが、コンテナに文字列を挿入しているだけです。これらのいずれもが STL 型であると想定しないでください。以下について一般的な用語で考えてください。
- for ループ内の乱雑な条件は、毎回評価されるのでしょうか、それとも 1 回だけでしょうか?
- これらの get メソッドが単にオブジェクトのメンバー変数への参照を返す場合、それらはインライン化されますか?
- カスタム [] 演算子がまったく最適化されると思いますか?
言い換えれば、次のようなものに変換するのに時間をかける価値があります (パフォーマンスのみで、読みやすさではありません)。
これは 1 秒間に何百万回も呼び出されるタイトなループです。私が疑問に思っているのは、これらすべてがループごとに数サイクル削減されるのか、それとももっと実質的なものになるのかということです。
はい、「時期尚早の最適化」についての引用を知っています。そして、プロファイリングが重要であることを知っています。しかし、これは最新のコンパイラ、特に Visual Studio に関するより一般的な質問です。
optimization - CSSとGoogleのページ速度を最適化する
私はグーグルページの速度を使用しています、そしてそれは私のcssが非効率的であると私に言っています...
非常に非効率的なルール(どのページでも修正できます):
cssルールは
テーブル(データテーブル)の本体とは異なる背景色のヘッダーとフッターが必要です
- これが非効率的である理由は何ですか?
- それをより効率的にする方法は?
グーグルのために、theadとtfootにクラスを追加しません。
c++ - 関数ローカル静的 Const 変数の初期化セマンティクス
質問を詳しく読むのが面倒な人のために、質問は太字になっています。
これは、この質問のフォローアップです。これは、関数内の静的変数の初期化セマンティクスに関係しています。静的変数は一度初期化する必要があり、それらの内部状態は後で変更される可能性があります-私が(現在)リンクされた質問で行っているように。ただし、問題のコードでは、後で変数の状態を変更する機能は必要ありません。
文字列オブジェクトの内部状態を変更する必要がないため、私の立場を明確にさせてください。このコードは、メタ プログラミング用の特性クラス用であり、const char * const ptr の恩恵を受けるため、理想的にはローカル コストの static const 変数が必要です。私の経験に基づいた推測では、この場合、問題の文字列はリンクローダーによってメモリに最適に配置され、コードはより安全になり、意図したセマンティクスにマップされます。
これは、そのような変数のセマンティクスにつながります。「C++ プログラミング言語第 3 版 -- Stroustrup」には、この問題について (私が見つけた限りでは) 何も言うことがありません。つまり、変数は、スレッドの制御フローが最初にコードに到達したときに 1 回初期化されるということだけです。これにより、次のコードが適切かどうか、またそうでない場合、意図されたセマンティクスは何かを考えるようになります。
以下は GCC でコンパイルし、「yahoo」を 2 回出力します。これが私が望むものです-しかし、それは標準に準拠していない可能性があります(これが私がこの質問を投稿する理由です)。"SetString" と "String" の 2 つの関数を使用して、後者が最初の関数に転送されるようにする方がエレガントな場合があります。標準に準拠している場合、誰かがブースト(または他の場所)でのテンプレートの実装を知っていますか?
編集: 2010 年 5 月 11 日
次のマクロを使用して、コンパイル時の情報をエンコードするクラスで上記のゲッター/セッターを生成しています。
これらのマクロは、クラス宣言内に配置されます。例えば:
うまくいけば、これは他の人に役立つでしょう。