問題タブ [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 - パフォーマンスまたはコード サイズに関する C コーディング プラクティス - コンパイラが行うことを超えて
生成されたオブジェクト ファイルのパフォーマンスやサイズを決定できる C 言語でプログラマーができることを探しています。
たとえば、
1. 単純な get/set 関数をインラインとして宣言すると、パフォーマンスが向上する場合があります (フットプリントが大きくなります)
2. ループ変数自体の値を使用しないループの場合、カウントアップではなくゼロまでカウントダウンします。特定の値など
コンパイラーは、(上記の 2 つのポイントのような) 「単純な」トリックがまったく必要ないレベルまで進歩したようです。コンパイル中の適切なオプションはとにかく仕事をします。また、コンパイラが再帰を処理する方法に関する投稿もここで見ました。これは非常に興味深いものでした。では、C レベルで何をする必要があるのでしょうか。:)
私の特定の環境は次のとおりです。ARMアーキテクチャ(v4)用に再ターゲットされたGCC 4.3.3。しかし、他のコンパイラ/プロセッサに関する回答も歓迎され、むしゃむしゃ食べられます。
PS: 私のこのアプローチは、通常の「最初にコードを作成し、次にベンチマークし、最後に最適化する」というアプローチに反します。
編集:たまたま、質問を投稿した後に同様の投稿を見つけました。
c - C の高速ユークリッド除算
ユークリッド除算の剰余を取得することに興味があります。つまり、整数のペア (i、n) について、次のような r を見つけます。
簡単な解決策は次のとおりです。
しかし、これを何千万回も実行する必要があるので(多次元配列のイテレータ内で使用されます)、できれば分岐は避けたいです。要件:
- 分岐するが高速であることも望ましい。
- 正の n に対してのみ機能するソリューションは許容されます (ただし、負の i に対して機能する必要があります)。
- n は前もってわからず、> 0 かつ < MAX_INT の任意の値にすることができます
編集
実際には間違った結果を得るのは非常に簡単なので、期待される結果の例を次に示します。
- euc(0, 3) = 0
- euc(1, 3) = 1
- euc(2, 3) = 2
- euc(3, 3) = 0
- euc(-1, 3) = 2
- euc(-2, 3) = 1
- euc(-3, 3) = 0
これを最適化しても意味がないのではないかと心配する人もいます。境界外のアイテムが元の配列を繰り返す「仮想配列」内のアイテムに置き換えられる多次元イテレータにこれが必要です。したがって、配列 x が [1, 2, 3, 4] の場合、仮想配列は [...., 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]、たとえば x[-2] は x 1など...
次元 d の nd 配列の場合、すべての点について d ユークリッド除算が必要です。am^d カーネルを使用して an^d 配列を相関させる必要がある場合は、n^d * m^d * d ユークリッド除算が必要です。100x100x100 ポイントの 3D 画像と 5*5*5 ポイントのカーネルの場合、それはすでに ~ 4 億のユークリッド分割です。
assembly - xor reg、regを使用すると、mov reg、0よりも有利になりますか?
x86で整数レジスタをゼロ値に設定する2つのよく知られた方法があります。
また
また
値0がコードに格納されておらず、生成されたマシンコードの数バイトを節約するため、2番目のバリアントの方が優れているという意見があります。これは間違いなく良いことです-使用される命令キャッシュが少なく、これによりコードの実行が速くなる場合があります。多くのコンパイラがそのようなコードを生成します。
ただし、正式には、xor命令と、同じレジスタを変更する以前の命令との間には、命令間の依存関係があります。依存関係があるため、後者の命令は前者が完了するまで待機する必要があり、これによりプロセッサユニットの負荷が低下し、パフォーマンスが低下する可能性があります。
xorの結果は、初期レジスタ値に関係なくまったく同じになることは明らかです。しかし、プロセッサはこれを認識できますか?
VC++7で次のテストを試しました。
最適化をオフにすると、両方のループにまったく同じ時間がかかります。xor reg, reg
これは、プロセッサが以前の命令に命令が依存していないことを認識していることを合理的に証明していmov eax, 0
ますか?これをチェックするためのより良いテストは何でしょうか?
java - スマート JVM と JIT のマイクロ最適化
時間の経過とともに、Sun の JVM と JIT はかなりスマートになりました。マイクロ最適化が必要であると以前はよく知られていたことは、あなたに代わって処理されるため、もはや必要ありません。
たとえば、以前は、可能なすべてのクラスを final としてマークする必要があったため、JVM はできるだけ多くのコードをインライン化しました。ただし、現在、JIT は、実行時にロードされるクラスに基づいてクラスが final であるかどうかを認識しており、クラスをロードして元のクラスを final 不可にする場合、メソッドのインライン化を解除し、そのマークを解除します。最後の。
JVM または JIT は、他にどのようなスマートなマイクロ最適化を行いますか?
編集: これをコミュニティ wiki にしました。時間をかけて集めていきたいと思います。
php - PHP関数実行コスト表
すべてのphp関数の実行コストを示す参照表はありますか?
時間の実行は多くの要因に制限されており、一意の値を決定することは不可能であることは知っていますが、「イデオロギー」テーブルを探しています。
例えば、
(例として取り上げてください;)
私が悪いことを覚えていない場合、Cには、すべての操作に必要なCPUサイクルのテーブルがあります..
編集:あなたのコメントをすべて読んだので、私のニーズに合ったテーブルがあります。
とにかく、私はそれを知っています
しかし、私はこの状況を受け入れるのに少し苦労しています(あなたの言葉を正しく理解していれば、それは可能です)。
java - WebページのコンテンツをJavaで文字列に読み込むための最適な方法は何ですか?
指定されたURLでHTMLページのコンテンツ全体をフェッチする次のJavaコードがあります。これはより効率的な方法で行うことができますか?どんな改善でも大歓迎です。
線の読みが最適ではないと感じずにはいられません。私はおそらく電話MalformedURLException
によって引き起こされたものを隠していることを知っていopenConnection
ます、そして私はそれで大丈夫です。
私の関数には、HTML文字列に現在のシステムの正しい行末記号を持たせるという副作用もあります。これは必須ではありません。
ネットワークIOは、HTMLの読み取りにかかる時間をおそらく短縮することを理解していますが、それでもこれが最適であることを知りたいと思います。
StringBuilder
ちなみに、オープンのコンストラクターがあれば、InputStream
のすべてのコンテンツを取得して、InputStream
それをに読み込むことができれば素晴らしいと思いStringBuilder
ます。
css - CSSの最適化:狭い定義(#mytable tbody span.myclass)の方が良いですか?
次のような「狭い」定義かどうか疑問に思いました
ただよりも解析する方が良い/速い
狭い定義が実際にCSSの速度に何らかの悪影響を与えると思われることをどこかで読んだのですが、どこにあるのか思い出せず、もうしばらく経っているので、それが重要かどうか、重要な場合はどの解決策かを明確にしたいと思いました。より良い/より速いです。
ありがとうございました!
c - 構造体の C ポインターと直接メンバー アクセス
次のような構造体があるとします...
...そして、私はこのタイプのグローバル変数を持っています(私はグローバルの落とし穴をよく知っています. ) 構造体のメンバーに直接アクセスするか、ポインターを介してアクセスする方が高速ですか? すなわち
また
私の仕事の 1 つは、最近継承された組み込みシステムを単純化して修正することです。
python - Pythonで「while」または「forxrange」の方が速いもの
次のような数値反復を実行できます。
およびCスタイル:
はい、私は知っています、最初のものはエラーが発生しにくく、よりPythonicですが、Cスタイルバージョンとしては十分に高速ですか?
PS。私はC++の惑星から来ており、Pythonの惑星ではかなり新しいです。
java - Java、最も高価なステートメント?
Java プログラミング言語で最もコストのかかる (バイトコードと CPU サイクルの両方の点で) ステートメントは何ですか?