問題タブ [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.
java - Java コンパイラの最適化
Javaコンパイラは、以下のループを抽出することによって最適化するのに十分スマートですか?
forループの外?
c++ - Visual C++.NET 、速度の最適化
VC++ コードをできるだけ速く実行したい。プロジェクトのプロパティと設定で何を変更または設定する必要があるか知っている人はいますか?
c# - VisualStudioビルドの「コードの最適化」オプションの利点
C#リリースコードの多くは、[コードの最適化]オプションをオフにしてビルドされています。これは、リリースモードでビルドされたコードをより簡単にデバッグできるようにするためだと思います。
バックエンドWebサービスに接続する非常に単純なデスクトップソフトウェア(つまり、特にプロセッサを集中的に使用するアプリケーションではない)を作成しているとすると、何らかのパフォーマンスの低下が予想される場合はどうでしょうか。
また、特定のプラットフォームがさらに影響を受ける可能性はありますか?例えば。マルチプロセッサ/64ビット。
c++ - C++ は、VS での「より優れた」リリース モード ビルドを定義します
現在、次のプリプロセッサ定義とさまざまな最適化設定を使用しています。
- WIN32_LEAN_AND_MEAN
- VC_EXTRALEAN
- NOMINMAX
- _CRT_SECURE_NO_WARNINGS
- _SCL_SECURE_NO_WARNINGS
- _SECURE_SCL=0
- _HAS_ITERATOR_DEBUGGING=0
私の質問は、VS C++ (2008、2010) からのリリース モードビルドを可能な限り高性能にするために、他の SOers が使用、追加、定義するものは何ですか?
ところで、私は PGO などを試しましたが、少しは役に立ちますが、GCC と同等になるものは何もありません。また、ストリームを使用していません。C++ は C に似ているが、テンプレートと STL アルゴリズムを利用しています。等
現状では、02 を使用して Linux (2.6+ カーネル) を実行している同等の x86 マシンで GCC が生成するものと比較すると、非常に単純なコード セグメントのパフォーマンスは見劣りします。
補足:多くの問題は、MS が提供する STL バージョン (Dinkum) に直接関係していると思います。VS C++ で STLPort などを使用した経験について詳しく教えてください。
multicore - GCC ソース コードを理解するための指針
私は、マルチコア プロセッサ用に GCC を最適化する作業をしている学生です。ソースコードを調べてみましたが、バックエンドにコードを追加する必要があるため、理解するのは困難です。さまざまなフェーズのコード フローを説明する優れたリソースを提案できますか。また、主にコードをステップ実行するために GCC をデバッグするための開発環境を提案します。Windowsでも可能ですか?
language-features - 言語とVM:最適化が難しい機能とその理由
研究プロジェクトの準備として、機能の調査を行っています。
最適化するのが難しい主流の言語または言語機能に名前を付け、その機能が支払った価格に見合う価値がある、または価値がない理由を挙げてください。あるいは、事例証拠を使って以下の私の理論を暴くだけです。誰かがこれを主観的なものとしてフラグを立てる前に、言語や機能の具体例、これらの機能の最適化のアイデア、または私が考慮していない重要な機能を求めています。また、私の理論が正しいか間違っているかを証明する実装への参照。
最適化が難しい機能と理論のリストのトップ(私の理論のいくつかはテストされておらず、思考実験に基づいています):
1)ランタイムメソッドのオーバーロード(別名マルチメソッドディスパッチまたは署名ベースのディスパッチ)。ランタイムの再コンパイルやメソッドの追加を可能にする機能と組み合わせると、最適化するのは難しいですか。それとも、とにかく難しいですか?コールサイトのキャッシュは、多くのランタイムシステムで一般的な最適化ですが、マルチメソッドを使用すると複雑さが増すだけでなく、インラインメソッドの実用性が低下します。
2)タイプモーフィング/バリアント(変数ベースではなく値ベースのタイピング)基本ブロックで何かのタイプが変更できるかどうかわからない場合、従来の最適化は単純に適用できません。マルチメソッドと組み合わせると、インライン化は慎重に行う必要があります。おそらく、呼び出し先のサイズの特定のしきい値に対してのみ行う必要があります。すなわち。単純なプロパティフェッチ(ゲッター/セッター)のインライン化を検討するのは簡単ですが、複雑なメソッドのインライン化はコードの膨張を引き起こす可能性があります。もう1つの問題は、型情報を持ち歩く必要があるため、またはすべての変数に1ではなく2つのレジスタが必要なため、レジスタにバリアントを割り当ててネイティブ命令にJITすることができないことです。IA-32では、これは不便です。 x64の追加レジスタで改善されました。これは、プログラマーの観点から非常に多くのことを単純化するので、おそらく動的言語の私のお気に入りの機能です。
3)ファーストクラスの継続-それらを実装する方法は複数ありますが、私は最も一般的なアプローチの両方でこれを行いました。1つはスタックコピーであり、もう1つは継続渡しスタイル、サボテンスタック、コピーオンライトスタックフレームを使用するランタイムを実装する方法です。とガベージコレクション。ファーストクラスの継続には、リソース管理の問題があります。継続が再開された場合に備えて、すべてを保存する必要があります。「意図」を持って継続を残すことをサポートしている言語があるかどうかはわかりません(つまり、「私はここに戻ってこないので、この世界のコピーを破棄してもかまいません」 )。スレッドモデルと継続モデルでプログラムしたので、どちらも同じことを達成できることはわかっていますが、継続は エレガンスはランタイムにかなりの複雑さを課し、キャッシュの効率にも影響を与える可能性があります(継続とコルーチンを使用すると、スタックの局所性がさらに変化します)。もう1つの問題は、ハードウェアにマップされないことです。継続を最適化することは、あまり一般的でないケースを最適化することであり、私たちが知っているように、一般的なケースは高速であり、あまり一般的でないケースは正しいはずです。
4)ポインタ演算とポインタをマスクする機能(整数での格納など)これを投入する必要がありましたが、実際にはこれがなくても簡単に生活できました。
私の気持ちは、特に動的言語の高レベルの機能の多くは、ハードウェアにマッピングされていないということです。。マイクロプロセッサの実装には、チップ上の最適化の背後にある数十億ドルの研究がありますが、言語機能の選択により、これらの機能の多くが無視される可能性があります(キャッシング、レジスタへのスタックのトップのエイリアシング、命令並列処理、リターンアドレスバッファ、ループなどの機能)バッファと分岐予測)。マイクロ機能のマクロアプリケーションは、一部の開発者が考えるように必ずしもパンアウトするわけではなく、VMに多くの言語を実装すると、ネイティブopsが関数呼び出しにマッピングされることになります(つまり、言語が動的であるほど、ルックアップする必要があります/実行時にキャッシュするため、何も想定できないため、命令の組み合わせは、従来よりも高い割合の非ローカル分岐で構成されています。静的にコンパイルされたコード)そして私たちが本当にうまくJITできる唯一のことは、非動的型の式評価と定数型または即時型の操作です。このため、バイトコード仮想マシンとJITコアが特定の言語に対して常に正当化されるとは限らないというのが私の直感です。
私はあなたの答えを歓迎します。
java - コンストラクターをチェーンするとき、JVM の暗黙的なメモリバリアはどのように動作しますか?
不完全に構築されたオブジェクトに関する以前の質問を参照して、2 つ目の質問があります。Jon Skeet が指摘したように、コンストラクターの最後には暗黙的なメモリ バリアがあり、final
フィールドがすべてのスレッドから見えるようになっています。しかし、コンストラクターが別のコンストラクターを呼び出すとどうなりますか。それらのそれぞれの終わりにそのようなメモリバリアがありますか、それとも最初に呼び出されたものの最後にのみありますか? つまり、「間違った」ソリューションが次の場合です。
正しいものは、ファクトリ メソッドのバージョンです。
以下も機能しますか?
更新:本質的な問題は、上記のプライベート コンストラクターthis()
を実際に呼び出すことが保証されていることです(この場合、意図した場所にバリアがあり、すべてが安全です)、またはプライベート コンストラクターがパブリックコンストラクターにインライン化される可能性はありますか? 1 つのメモリ バリアを節約するための最適化 (この場合、パブリック コンストラクターの最後までバリアはありません)?
のルールはthis()
正確にどこかに定義されていますか? そうでない場合は、チェーンされたコンストラクターのインライン化が許可されていると想定する必要があると思いますjavac
。
c++ - x64 のレジスタで MSVC に構造体引数を渡す方法はありますか?
署名付き関数の場合:
Pair
x64 でコンパイルした場合、関数が次のように、 のフィールドをレジスタ経由で渡したいと思います。
OSX 10.6 で x86_64 用の gcc 4.2.1 を使用してテストをコンパイルすると、逆アセンブリを調べると、これがまさに何が起こるかがわかります。ただし、Windows で x64 用の MSVC 2008 を使用してコンパイルすると、逆アセンブリPair
により、スタックに渡されたことが示されます。プラットフォーム ABI がこの最適化を妨げる可能性があることを理解しています。これを機能させることができる MSVC 固有の注釈、呼び出し規約、フラグ、またはその他のハックを知っている人はいますか?
ありがとうございました!
c++ - 「volatile」修飾子とコンパイラの並べ替え
volatile
コンパイラは、修飾された変数への読み取り/書き込みを削除したり、並べ替えたりすることはできません。
しかし、修飾されているかどうかに関係なく、他の変数が存在する場合はvolatile
どうでしょうか?
シナリオ 1
コンパイラは、1 番目と 2 番目、または 3 番目と 4 番目の代入を並べ替えることができますか?
シナリオ 2
同じ質問ですが、コンパイラは最初と 2 番目、または 3 番目と 4 番目の代入を並べ替えることができますか?
c++ - コンパイラでのコピー メソッドの最適化
次のコードがあります。
次のように使用されています。
CopyStack の宣言から参照シンボルを削除しても (参照ではなくコピーを返す)、Visual Studio 2008 では違いがありません (コピーが呼び出される回数に関して)。私はそれが最適化されていると思います-通常、最初に戻り値のコピーを作成し、次に割り当て演算子をもう一度呼び出して変数scに割り当てます。
さまざまなコンパイラでのこの種の最適化について、どのような経験がありますか?
よろしく、 ジェナン