問題タブ [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++ の場合) はコンパイラによって決定されますか?
inline キーワードを使用したり、クラス宣言にメソッドを挿入したり、短い ctor または getter メソッドを使用したりできることは理解していますが、メソッドをいつインライン化するかについて最終的な決定を下すのはコンパイラですか?
例えば:
コードが非効率になるとコンパイラが判断した場合、コンパイラはインライン宣言を無視しますか?
副次的な問題として、次のようにクラス外で宣言された getter メソッドがある場合:
コンパイラはこれを裏でインライン化しますか?
c++ - switch ステートメントを最適化するときの Visual Studio 2005 C コンパイラの問題
他の人が興味を持つかもしれない一般的な質問:
私は、switch ステートメントで C++ コンパイラの最適化 (Visual Studio 2005) の問題に遭遇したと思います。私が知りたいのは、私の好奇心を満たし、コンパイラが何をしようとしているが失敗しているのかを知る方法があるかどうかです。解読に時間を費やすことができるログはありますか (おそらく時間がかかりすぎます)。
続きを読みたいという好奇心旺盛な人のための私の特定の問題- この特定のケースで問題が発生する理由について、あなたの考えを聞きたいです。
switch ステートメントを含む約 500 行のコードを含む小さなプログラムがあります。一部のケースには、ポインターの割り当てが含まれています。
中間のステートメントでコンパイラがハングしているようです。コンパイルは終わりません。OK、廊下を歩き、何人かと話し、コーヒーを飲んで机に戻るまでにそれほど時間はかかりませんでしたが、これは通常 1 秒以内にコンパイルされる小さなプログラムです。1 行 (上記のコードに示されている行) を削除すると、最適化 (プログラム全体または関数で #pragma を使用) を削除する場合と同様に、問題は解消されます。
この中間線が問題を引き起こすのはなぜですか? コンパイラのオプティマイザは pty を好みません。プログラム内のベクトル ptx、pty、および ptz に違いはありません。私が pty に対して行うことはすべて、ptx と ptz に対して行います。ppt で位置を交換しようとしましたが、pty は依然として問題を引き起こしている行でした。
どうなっているのか気になったので質問させていただきます。コードは書き直され、正常に動作しています。
編集: ほぼ 2 週間後、上記のコードに最も近いバージョンをチェックアウトしましたが、元に戻してクラッシュさせることはできません。これは本当に迷惑で、恥ずかしくてイライラします。もう一度試してみますが、すぐに壊れない場合は、質問のこの部分が時代遅れになっていると思いますので、削除します。お時間を頂戴し誠に申し訳ございませんでした。
c++ - C++は自動的にconstintsをfloatにキャストしますか?
intをfloatにキャストする(およびその逆)のはかなり費用がかかることを私は知っています。ただし、コンパイラは、コード内の定数に対してコンパイル時に自動的にそれを実行しますか?たとえば、間に違いはありますか
と
後者を実行するコードがいくつかありますが、それが最適化のためか安全性の問題かはわかりません(つまり、yがintであっても、除算が浮動小数点であることを確認するだけです)。
私はgccを使用しています(答えはコンパイラ固有である可能性があるため)。
また、コンパイラが一般的に最適化できるものとできないもののリストへのポインタをいただければ幸いです。ありがとう!
g++ - 異なる g++ バージョンで生成されたコードのベンチマーク
私は、パフォーマンスに非常に敏感なアプリケーション ドメインのランタイム システムに取り組んでいます。最近実装された言語構造を回避し、古いバージョン用に合成するなど、古いバージョンのコンパイラとの下位互換性を維持するために多くの努力を払っています。
しかし、私は、この取り組みが、膨大な量のパフォーマンスを犠牲にしているコンパイラ リリースを引き続き使用できるようにすることで、ユーザーに不利益をもたらすことを懸念しています。残念ながら、リリース間の実行パフォーマンスの実際の比較を見つけることができませんでした。この問題に関するレポートへのリンクを誰かが持っている場合は、投稿してください。
幅広いリリース (3.2 に戻すことができれば、それは素晴らしいことです) とアプリケーション/テストをカバーするベンチマークをぜひ見てみたいと思います。
compiler-optimization - MS VS-2005 コンパイラの最適化で未使用/未実行のコードが削除されない
私はすべてのCコードでMS-Visual Studio 2005を使用して構築されたワークスペースを持っています。呼び出されていないがコンパイルされている多くの関数が表示されます(コンパイルを無効にするコンパイル時マクロの下にはありません)。
MS-VS2005 プロジェクトに次の最適化設定を設定して、未使用のコードを削除しました。
最適化レベル - /Ox
プログラム全体の最適化を有効にする - /GL
Favor speed /Ot と Favor Size /Os の両方を試しました
これらすべてのオプションにもかかわらず、リンカが生成したマップ ファイルを見ると、マップ ファイルに存在するシンボル (unsed 関数) の名前が表示されます。
何か不足していますか?未使用のコードを完全に削除したい。
どうすればいいですか?
optimization - 先読み言語と複数ファイル用のコンパイラを作成しますか?
私の言語では、定義がメソッドの下に表示されるときに、メソッドでクラス変数を使用できます。また、自分のメソッドなどの下のメソッドを呼び出すこともできます。「ヘッダー」はありません。この C# の例を見てみましょう。
それをどのようにコンパイルすればよいですか?私が考えていたのは:
- pass1: すべてを AST に変換します
- pass2: すべてのクラスを調べて、define classes/variable/etc のリストを作成します。
- pass3: コードを調べて、未定義の変数、間違った使用などのエラーがあるかどうかを確認し、出力を作成します
しかし、これが機能するように思えます.pass3を実行する前に、すべてのファイルに対してpass 1と2を実行する必要があります. また、構文エラーが見つかるまで、やるべきことがたくさんあるように感じます (ブレースを閉じるのを忘れたり、16 進値の代わりに 0xLETTERS を書き込んだりするなど、解析時に実行できる明らかなエラーを除きます)。私の腸は、他の方法があると言っています。
注: bison/flex を使用してコンパイラを生成しています。
optimization - 最新の最適化コンパイラは最適化のタイミングをどのように決定しますか?
最新の最適化コンパイラは、ループの展開やコードのインライン化などの特定の最適化をいつ適用するかをどのように決定しますか?
これらは両方ともキャッシングに影響するため、単純に X 行未満の関数をインライン展開したり、その他の単純なヒューリスティックを使用したりすると、パフォーマンスの悪いコードが生成される可能性があります。では、現代のコンパイラはこれをどのように処理するのでしょうか?
これに関する情報 (特に、かなり理解しやすい情報) を見つけるのに苦労しています。詳細、書籍/記事/論文へのリンクは大歓迎です!
編集:答えは主に私が言及した2つの最適化(インライン化とループ展開)について話しているので、これら2つだけでなく、すべてのコンパイラー最適化に興味があることを明確にしたかっただけです。また、事前コンパイル中に実行できる最適化にも関心がありますが、JIT 最適化にも関心があります (程度はわずかですが)。
ありがとう!
compiler-construction - コードの並べ替えとインターリーブ
コードのコンパイル、最適化、および実行に関して、並べ替えとインターリーブは交換可能な用語ですか?
c++ - C ++コンパイラはコードを最適化しますか?
最新のC++コンパイラ(MSVC、GCC、ICCを含む)を使用しているときに、次のように言うことができます。
- コードを並列化
- ループをベクトル化(または他の特定のプロセッサ命令を使用)
- ループを展開しました
- 末尾再帰が検出されました
- RVO(戻り値の最適化)を実行
- または他の方法で最適化
コンパイラが生成するアセンブラコードに飛び込むことなく?
compiler-construction - お気に入りの抽象構文ツリーの最適化
コンパイラを構築する場合、AST レベルでどのような最適化を行うのが最適でしょうか?