問題タブ [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.
c - より優れた最適化のためのオプションを提供する無料のCコンパイラはどれですか?
特に最適化に関して、Cコンパイラの比較を教えてください。
c++ - ミューテックス境界の周りでコンパイラを並べ替えますか?
独自の非インライン関数LockMutexとUnlockMutexがあり、これらは内部でブーストなどの適切なミューテックスを使用しているとします。LockMutexおよびUnlockMutexの呼び出しに関して、コンパイラーは他の操作を並べ替えないことをどのように知るのでしょうか。これらの関数を他のコンパイルユニットにどのように実装するかは、おそらくわかりません。
ps:ロックを解除するために、クラスのインスタンスを使用してロックを保持することになっています。例を簡略化するために、これは省略しました。
optimization - コンパイラの最適化によってバグが発生する可能性はありますか?
今日、友人と「コンパイラの最適化」について数時間議論しました。
私は、コンパイラの最適化によってバグが発生したり、少なくとも望ましくない動作が発生したりする可能性があるという点を擁護しました。
私の友人は、「コンパイラは賢い人々によって構築され、賢いことを行う」と言って、完全に反対しました。
彼は私をまったく納得させませんでしたが、私の主張を補強する実例が不足していることを認めなければなりません。
ここにいるのは誰?私がそうである場合、コンパイラの最適化によって結果として得られるソフトウェアにバグが発生した実際の例はありますか? もし私が間違っていたら、プログラミングをやめて代わりに釣りを学ぶべきですか?
c++ - パフォーマンスの低下を引き起こすコンパイラの最適化
奇妙な問題が 1 つあります。次のコードがあります。
内側のループは約 200,000 回実行され、関数全体が完了するまでに 100 ミリ秒かかります。(AQTimer を使用してプロファイリング)
double d = 0.0;
外側のループの外側で未使用の変数を見つけ、 それを削除しました。この変更後、突然、同じ回数の実行でメソッドが 500 ミリ秒かかるようになりました。(5倍遅い)。
この動作は、異なるプロセッサ タイプの異なるマシンで再現可能です。(Core2、デュアルコア プロセッサ)。
最適化レベル の VC6 コンパイラを使用していますO2
。使用されるその他のコンパイラ オプションは次のとおりです。
コンパイラの最適化を疑い、コンパイラの最適化を削除しました/O2
。その後、関数が正常になり、古いコードとして 100ms かかっています。
誰かがこの奇妙な振る舞いに光を当てることができますか?
未使用の変数を削除すると、コンパイラの最適化によりパフォーマンスが低下するのはなぜですか?
注: アセンブリ コード (変更前と変更後) は同じように見えました。
c# - 準拠するC#コンパイラは、ローカル(ただし未使用)変数がオブジェクトへの唯一の強力な参照である場合、それを最適化できますか?
これらの関連リソースも参照してください。
- .NETガベージコレクターはコードの予測分析を実行しますか?(スタックオーバーフロー上)
- WP7:GCがローカル変数をガベージと見なすのはいつですか(MSDNのブログ記事)
言い換えると:
ローカル変数によって参照されているオブジェクトは、変数がスコープ外になる前に再利用できますか(たとえば、変数が割り当てられているが、再度使用されないため)、または変数が外れるまでガベージコレクションの対象外であることが保証されていますか?範囲?
説明させてください:
object
このコード例では、明らかに、新しい'edがガベージコレクターによって再利用される可能性を計画する必要があります。したがって、if
ステートメント。
weakRef
(私は、新しい'edがまだ存在するかどうかを確認することのみを目的として使用していることに注意してくださいobject
。)
このコード例の前のコード例からの主な変更点は、new'edobject
がローカル変数(unusedLocalVar
)によって強く参照されることです。weakRef
ただし、弱参照( )が作成された後は、この変数が再び使用されることはありません。
質問:準拠しているC#コンパイラーは、の最初の2行を、1つの場所でのみ、つまりコンストラクターへの引数として使用されているCase_2
とCase_1
判断した場合の行に最適化できますか?つまり、のアサーションが失敗する可能性はありますか?unusedLocalVar
WeakReference
Case_2
c++ - C ++パフォーマンス、コンパイラの最適化、.cppの空関数
私は非常に基本的なクラスを持っており、それをBasicと名付け、より大きなプロジェクトの他のほとんどすべてのファイルで使用されています。場合によっては、デバッグ出力が必要ですが、リリースモードでは、これを有効にせず、NOOPにする必要があります。
現在、ヘッダーには、設定に応じてマクロのオンとオフを切り替える定義があります。したがって、スイッチをオフにすると、これは間違いなくNOOPになります。次のコードがある場合、コンパイラー(MSVS / gcc)が関数呼び出しを最適化できるので、これもNOOPになるのではないかと思います。(そうすることで、スイッチは.cppにある可能性があり、スイッチングははるかに高速になり、コンパイル/リンクの時間的になります)。
sql - インデックス列を追加して SQL データベースを最適化する
次のようなデータベースがあるとします。
ProductName は Product の主キーで、何らかの文字列型で一意です。
OrderID は主キーで整数型であり、ProductName は外部キーです。
Product の主キーを整数型の新しい列に変更するとします[ProductID]
。
これにより、データベースのサイズが縮小され、これら 2 つのテーブルを結合するルックアップ (および同様の操作) が最適化されますか? それとも、これらの最適化は(ほとんど/一般/メイン) SQL データベースの実装によって自動的に実行されますか?
技術的には、(String) ProductName を の主キーとして使用するProduct
と、データベースは ProductName 列Order
を の行への単なるポインターとして実装し、整数を外部キーとして持つのと同じくらい迅速にProduct
実行できる必要があります。これは標準ですか? JOIN
SQL の実装方法。
更新: この質問は、製品テーブルにシリアル番号が必要かどうかや、データベース内の製品名の変更をどのように処理するかではなく、SQL サーバーが外部キーを処理する方法に関するものです。
.net - ToString() はコンパイラによって最適化されていますか?
次のコードがあるとします:
コンパイラはこれを次のように最適化します。
IL 逆アセンブラーで確認したところ、次の呼び出しがあります。
IL_005a: callvirt instance string [mscorlib]System.Object::ToString()
JIT がこれを最適化するかどうかはわかりません。
gcc - gccの共有ライブラリでプロファイルガイド付き最適化は可能ですか?
私は最近、Linux上でgcc4.5.0とbinutils2.20をゴールドで使用した新しいツールチェーンを公開しました。今、私はこの新しいものPGOに興味がありました。実行可能ファイルでどのように機能するかは明らかですが、共有ライブラリで答えを見つけることができませんでした。グーグル経由でgccメーリングリストに2つの未回答の投稿を見つけました。それだけです。
だから私が試したことは次のとおりです。-fprofile-generateにフラグを立てない限り、すべてが正常であり、私の.soはメインプログラムによってdlopen()され、問題なく動作します。コンパイルして-fprofile-generateでリンクすると、ライブラリが読み込まれ、すべてが機能しますが、メインプログラムを終了すると、coredumpを含むsigsegvが取得されます。
コアファイルをgdbにフィードし、これを取得しました。
そしてもちろん、.cddaファイルは保存されません。
何か案は?
フィリップ
c++ - 追加のg++最適化フラグを使用するようにextconf.rbに指示するにはどうすればよいですか?
私はRiceを使用してRubygemのC++拡張機能を作成しています。拡張子は共有オブジェクト(.so)ファイルの形式です。
これには、「mkmf」ではなく「mkmf-rice」が必要ですが、2つ(AFAIK)は非常に似ています。
デフォルトでは、コンパイラはフラグを使用します-g -O2
。個人的には、最適化を有効にしてデバッグするのは難しいので、この種のばかげていると思います。Makefileを編集して、気に入らないフラグを削除しました(たとえば、Rubyのフックの代わりに-fPIC -shared
デバッグが必要な場合は削除します)。main()
しかし、もっと良い方法が必要だと思います。私はただできることを知っています
追加のフラグを追加します。しかし、Makefileを直接編集せずに物を削除するにはどうすればよいですか?
二次的な質問:Rubyによってロードされた共有オブジェクトに対してどの最適化が安全ですか?私はそのようなことをすることができます-funroll-loops
か?皆さんは何をお勧めしますか?
これは科学計算プロジェクトなので、速いほど良いです。メモリはそれほど問題ではありません。