問題タブ [compiler-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.

0 投票する
2 に答える
158 参照

.net - スレッドと非ブロッキング同期を操作するときに知っておくべきコンパイラ、CLR、またはCPUの最適化は何ですか?

タイトルが示すように、スレッドと非ブロッキング同期を操作するときに知っておくべきコンパイラ、CLR、またはCPUの最適化は何ですか?

物事を壊す可能性のある効率を改善するための命令の並べ替え、および変数が他のスレッドにすぐに表示されないようにするキャッシュの最適化について少し読みました[0]が、他に(確かにあります)知っておく必要がありますか?

おすすめの読書/ブログ/記事などへのリンクは大歓迎です。

ありがとう、エギル。

更新:ジョー・ダフィーのブログ投稿へのジョンズのリンクのおかげで、私はあなたたちと共有すると思ったもっとたくさんの素晴らしい情報を見つけました:

0 投票する
7 に答える
22042 参照

c - 分岐予測子に分岐に従う可能性を伝えることは可能ですか?

明確にするために、ここでは移植性を求めているわけではないので、特定のボックスに結び付けるソリューションは問題ありません。

基本的に、99% の確率で true と評価される if ステートメントがあり、最後の 1 クロックのパフォーマンスを引き出しようとしています。何らかのコンパイラ コマンドを発行できますか (GCC 4.1.2 と x86 ISA を使用する場合、重要) 分岐予測子に、その分岐をキャッシュする必要があることを伝えますか?

0 投票する
2 に答える
3866 参照

c++ - C++0x メモリ モデルと投機的ロード/ストア

そこで私は、来たる C++0x 標準の一部であるメモリ モデルについて読んでいました。ただし、コンパイラーが許可されていること、特に投機的なロードとストアに関するいくつかの制限については、少し混乱しています。

まず、関連するもののいくつか:

C++0x のスレッドとメモリ モデルに関する Hans Boehm のページ

Boehm、「スレッドはライブラリとして実装できない」

Boehm と Adve、「C++ 同時実行メモリ モデルの基礎」

Sutter、「Prism: Microsoft ネイティブ コード プラットフォーム向けの原理ベースのシーケンシャル メモリ モデル」、N2197

Boehm、「同時実行メモリ モデル コンパイラの結果」、N2338

現在、基本的な考え方は本質的に「データ競合のないプログラムの順次整合性」です。これは、プログラミングの容易さと、コンパイラとハードウェアの機会を最適化できるようにすることとの間の適切な妥協点のようです。データ競合は、異なるスレッドによる同じメモリ ロケーションへの 2 つのアクセスが順序付けられておらず、そのうちの少なくとも 1 つがメモリ ロケーションに格納され、そのうちの少なくとも 1 つが同期アクションではない場合に発生するように定義されています。これは、共有データへのすべての読み取り/書き込みアクセスが、ミューテックスやアトミック変数の操作など、何らかの同期メカニズムを介して行われる必要があることを意味します (まあ、専門家のみが緩和されたメモリ順序でアトミック変数を操作することは可能ですが、デフォルトではシーケンシャルな一貫性のため)。

これに照らして、通常の共有変数に対するスプリアスまたは投機的なロード/ストアに関する制限について混乱しています。たとえば、N2338 には次の例があります。

コンパイラが変換することを許可されていない

y == 2 の場合、x への偽の書き込みがあり、別のスレッドが x を同時に更新している場合に問題になる可能性があるためです。しかし、なぜこれが問題なのですか?これはデータ競合であり、とにかく禁止されています。この場合、コンパイラは x に 2 回書き込むことで状況を悪化させますが、1 回の書き込みでもデータ競合には十分ですよね? つまり、適切な C++0x プログラムは x へのアクセスを同期する必要があります。その場合、データ競合はなくなり、スプリアスストアも問題になりませんか?

N2197 の例 3.1.3 と他のいくつかの例についても同様に混乱していますが、上記の問題の説明でそれも説明できるかもしれません。

編集:答え:

投機的ストアが問題となる理由は、上記の switch ステートメントの例では、y != 2 の場合に限り x を保護するロックを条件付きで獲得することをプログラマーが選択した可能性があるためです。元のコードであるため、変換は禁止されています。同じ議論が N2197 の例 3.1.3 にも当てはまります。

0 投票する
5 に答える
2734 参照

c# - コンパイルの最適化が有効になっている場合にのみ発生するバグ

最適化を有効にしてコードをビルドした場合にのみ再現されるコードのバグに遭遇しました。テスト用のロジックを複製するコンソールアプリを作成しました(以下のコード)。最適化を有効にすると、この無効なロジックの実行後に「value」がnullになることがわかります。

修正は簡単で、問題のあるコードの下にコメントアウトされています。しかし...私はアセンブラのバグに遭遇したかもしれないか、おそらく他の誰かが値がnullに設定される理由の説明を持っているかもしれないことをもっと心配しています。

通常の出力は次のようになります。

バグのある出力は次のとおりです。


My Envは、.NET3.5SP1を搭載したWindowsServer2003R2を実行しているVMです。VS2008チームシステムの使用。

ありがとう、

ブライアン

0 投票する
5 に答える
7876 参照

c - C コンパイラは、大きな構造体を返す関数をどのように実装しますか?

関数の戻り値は通常、スタックまたはレジスタに格納されます。しかし、大きな構造体の場合、スタック上になければなりません。このコードを実際のコンパイラでコピーする必要があるのはどれくらいですか? それとも最適化されていますか?

例えば:

(関数をインライン化できないと仮定します..)

0 投票する
2 に答える
375 参照

c++ - 長さがコンパイラにわかっているのに、文字列の割り当てが最適化されないのはなぜですか?

今日、いくつかのタイミングコードで遊んでいたところ、文字列リテラルをstd :: stringに割り当てると、約10%高速であることがわかりました(12文字の短い文字列の場合、大きな文字列の場合はさらに大きな違いがあります)。 (sizeof演算子を使用して)既知の長さのリテラルを使用します。(VC9コンパイラでのみテストされているので、他のコンパイラの方がうまくいくと思います)。

さて、私が疑う理由は、文字列の長さを取得するためにstrlenを呼び出さなければならないためです(VC9は私の強みではないため、100%確実ではありません)。その後、2番目の場合と同じようにします。

std :: stringが存在していた期間と、最初のケースが実際のプログラムでどれほど一般的であるか(特に、+、=、+ =などの演算子と同等のメソッドを含める場合)を考えると、どうして最初のケースが最適化されないのでしょうか。 2番目に?std :: basic_stringオブジェクトであり、リテラルであるかどうかを言うのも非常に単純なようです。bのように記述されているかのようにコンパイルしますか?

0 投票する
2 に答える
663 参照

vb.net - VB.NET Select Caseコンパイラの最適化?

VB.NET 2008コンパイラはSelectCaseステートメントを選択的に最適化しますか?

たとえば、十分な数の整数のcaseを含むSelect Caseステートメントは、バイナリ検索として編成できます。

整数または他の基本的なデータ型が比較されている複数のElseIfを持つIfステートメントの代わりにSelectCaseを選択する必要があるかどうか知りたいので、これを尋ねます。

0 投票する
1 に答える
283 参照

c++ - C++でオブジェクトを使用する場合のパフォーマンスへの影響

C++でのKnapsackの動的計画法アルゴリズムがあります。関数として実装され、渡された変数にアクセスすると、特定のインスタンスで実行するのに22秒かかりました。これをクラスKnapsackInstanceのメンバー関数にして、そのクラスのデータメンバーである変数を使用させると、実行に37秒かかり始めました。私の知る限り、メンバー関数へのアクセスのみがvtableを通過するため、何が起こっているのかを説明するのに迷っています。

これが関数のコードです

tblは、DPテーブルの1つの列です。最初の列から始めて、最後の列まで進みます。ProfitsWeights変数はペアのベクトルであり、最初の要素は利益で、2番目の要素は重みです。toretは返す値です。

これが元の関数のコードです:-

これは、g++-4.3.2および-O3-DNDEBUGがオンになっているDebianLennyで実行されました。

ありがとう

0 投票する
3 に答える
1486 参照

c++ - C ++コピーコンストラクター、一時およびコピーセマンティクス

このプログラムの場合

私が得る出力は次のとおりです。

f()は値で返されるため、一時的なものを返す必要があります。のようT a = x;に、一時的に渡されたものを引数として、T a(x);の構築のためにコピーコンストラクターを呼び出しませんか?a

0 投票する
6 に答える
132932 参照

c - gcc コンパイラの最適化をオフにしてバッファ オーバーフローを有効にする方法

私は、コンパイラの最適化保護を無効にして機能させる必要がある宿題の問題に取り組んでいます。ubuntu Linuxでgcc 4.4.1を使用していますが、どのフラグが正しいのかわかりません。アーキテクチャに依存していることに気づきました-私のマシンは32ビットIntelプロセッサで実行されます。

ありがとう。