問題タブ [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 - 変数をグローバルに登録できないのはなぜですか?
あるサイトから読み込んでいるときに、レジスタ型のグローバル変数を作成できないと読みました。なぜそうなのですか? ソース: http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/regdef.htm
c - 二分探索アルゴリズムの反復ごとに 1 つの比較のみを行うことは可能ですか?
二分探索アルゴリズムでは、次の 2 つの比較があります。
上記の2つではなく、1つだけ比較できる方法はありますか。
--
ありがとう
Alok.Kr.
scala - 文字列表現をキャッシュするための遅延値の使用
JAXMag の Scala 特別号で次のコードに遭遇しました。
上記のコードで を使用lazy val
すると、次のコードよりもパフォーマンスが大幅に向上しますか?
それとも、不必要な最適化の単なるケースですか?
c++ - マイクロ最適化として、コードの一部を C++ ではなく C で書く価値はありますか?
最新のコンパイラとその最適化において、重要なコードを C++ ではなく C で記述して高速化する価値があるかどうか疑問に思っています。
C++ は、クラスがコピーされているときに参照渡しが可能である場合や、通常はオーバーロードされた演算子や他の多くの同様のケースを使用して、コンパイラによってクラスが自動的に作成された場合に、パフォーマンスが低下する可能性があることを知っています。しかし、これらすべてを回避する方法を知っている優秀な C++ 開発者にとって、C でコードを記述してパフォーマンスを向上させる価値はあるのでしょうか?
performance - MIPS (好奇心) レジスタをクリアするより速い方法は?
MIPS アセンブリでレジスタ (=0) をクリアする最速の方法は何ですか?
いくつかの例:
どれが最も効率的ですか?
c# - DateTime.NowDateTime.UtcNowが非常に遅い/高価なのはなぜですか
これはマイクロ最適化の領域にはあまりにも遠いことはわかっていますが、DateTime.NowとDateTime.UtcNowへの呼び出しがなぜそれほど「高価」であるのかを理解したいと思います。いくつかの「作業」(カウンターへの追加)を実行するいくつかのシナリオを実行し、これを1秒間実行しようとするサンプルプログラムがあります。私はそれを限られた時間で仕事をさせるためのいくつかのアプローチをしました。例は、DateTime.NowとDateTime.UtcNowがEnvironment.TickCountよりも大幅に遅いことを示していますが、それでも、別のスレッドを1秒間スリープさせてから、ワーカースレッドを停止するように示す値を設定する場合に比べて遅いです。
だから私の質問はこれらです:
- UtcNowはタイムゾーン情報がないため高速であることがわかっていますが、それでもTickCountよりもはるかに遅いのはなぜですか。
- ブール値をintよりも速く読み取るのはなぜですか?
- 限られた時間だけ何かを実行できるようにする必要があるが、実際に作業を行うよりも時間をチェックすることに多くの時間を無駄にしたくない、これらのタイプのシナリオに対処する理想的な方法は何ですか?
例の冗長性はご容赦ください。
java - 配列アクセスを最適化できますか?
プロファイラー (Netbeans) に惑わされているのかもしれませんが、奇妙な動作が見られます。ここの誰かが理解してくれることを願っています。
私は、かなり大きなハッシュ テーブル (キーは long、値はオブジェクト) を多用するアプリケーションに取り組んでいます。組み込みの Java ハッシュ テーブル (具体的には HashMap) のパフォーマンスは非常に低く、いくつかの代替手段 (Trove、Fastutils、Colt、Carrot) を試した後、自分で作業を開始しました。
コードは、ダブル ハッシュ戦略を使用した非常に基本的なものです。これはうまく機能し、これまでに試した他のすべてのオプションの中で最高のパフォーマンスを示しています。
問題は、プロファイラーによると、ハッシュ テーブルへのルックアップが、アプリケーション全体で最もコストのかかる単一のメソッドであるということです。他のメソッドが何度も呼び出されたり、より多くのロジックを実行したりしているにもかかわらずです。
私を本当に混乱させているのは、ルックアップが 1 つのクラスによってのみ呼び出されることです。呼び出し元のメソッドがルックアップを行い、結果を処理します。どちらもほぼ同じ回数呼び出され、ルックアップを呼び出すメソッドには、ルックアップの結果を処理するための多くのロジックが含まれていますが、約 100 倍高速です。
以下は、ハッシュ ルックアップのコードです。基本的に、配列へのアクセスは 2 回だけです (プロファイリングによると、ハッシュ コードを計算する関数は事実上無料です)。このビットのコードは単なる配列アクセスであるため、どのように遅くなるかわかりません。また、高速化する方法もわかりません。
コードは単にキーに一致するバケットを返すことに注意してください。呼び出し元はバケットを処理する必要があります。'size' は hash.length/2 で、hash1 はハッシュ テーブルの前半で検索を行い、hash2 は後半で検索を行います。key_index は、コンストラクターに渡されるハッシュ テーブルの最後の int フィールドであり、Entry オブジェクトの値配列は、通常は長さが 10 以下の long の小さな配列です。
これに関する人々の考えは大歓迎です。
ありがとう。
編集、hash1とhash2のコード
c++ - 浮動小数点除算と浮動小数点乗算
コーディングによる(マイクロ最適化以外の)パフォーマンスの向上はありますか
と比較して
私の教授は数年前に、浮動小数点の除算は浮動小数点の乗算よりも遅いと言いましたが、その理由は詳しく説明されていませんでした。
この声明は、最新の PC アーキテクチャにも当てはまりますか?
アップデート1
コメントに関しては、次のケースも考慮してください。
更新 2 コメントからの引用:
[私が知りたい] > 除算が乗算よりもハードウェアではるかに複雑になるアルゴリズム/アーキテクチャ要件は何かを知りたい
c++ - unsigned char 8 ビットを実際の数値に変換する最速の方法
を使用しunsigned char
て 8 つのフラグを格納しています。各フラグは立方体の角を表します。したがって00000001
、コーナー101000100
はコーナー3と7などになります。私の現在の解決策は&
、1、2、4、8、16、32、64、および128の結果に対するもので、結果がゼロでないかどうかを確認し、コーナーを保存します。つまり、if (result & 1) corners.push_back(1);
. その「if」ステートメントを取り除くことができる可能性はありますか? ビット単位の演算子でそれを取り除くことができることを望んでいましたが、何も考えられませんでした。
if ステートメントを削除したい理由について少し背景を説明します。この立方体実際には、サイズが少なくとも 512x512x512 のグリッドの一部であるボクセルです。これは 1 億 3,400 万を超えるボクセルです。ボクセルのそれぞれに対して計算を実行しています (厳密には正確ではありませんが、ここでは関係がないため詳細には触れません)。これは大量の計算です。そして、フレームごとにこれらの計算を実行する必要があります。関数呼び出しごとのわずかな速度向上は、これらの量の計算に役立ちます。アイデアを提供するために、私のアルゴリズムは(ある時点で)フロートが負、正、またはゼロであるかどうかを(何らかのエラー内で)判断する必要がありました。そこにifステートメントがあり、チェックよりも大きい/小さい。これを int 関数への高速フロートに置き換え、4 分の 1 秒短縮しました。現在、128x128x128 グリッドの各フレームには 4 秒強かかります。
php - PHPのマイクロ最適化
役に立たないマイクロ最適化手法を見つけるにはどうすればよいですか?
何を避けるべきですか?