問題タブ [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.
delphi - Delphi コンパイラは最適化を実行しますか?
Delphi 7 IDE を使用しています。Delphi コンパイラは、この次のリンクで C++ コンパイラが行っているように、コードを最適化しますか?
http://msdn.microsoft.com/en-us/library/aa366877(VS.85).aspx
ZeroMemory
この例で の代わりに が呼び出された場合SecureZeroMemory
、コンパイラは呼び出しを最適化できます。これは、szPassword
バッファーがスコープ外になる前に読み取られないためです。パスワードはアプリケーション スタックに残り、クラッシュ ダンプに取り込まれたり、悪意のあるアプリケーションによって調べられたりする可能性があります。
c# - コードの最適化によってプロパティが「インライン化」されるのはいつですか
これは初心者の質問のようなものです。私は単純なプロパティを持っています
クラス (および派生クラス) 内の他のプロパティやメソッドから何度も呼び出します。
コードを (私にとって) 読みやすくするため、このようにしておくのが好きですがIsRoot
、最終リリース コードでは「インライン化」されていない可能性があるため、すべての呼び出しが遅くなるのではないかと心配しています。「インライン」とは、 のparent==null
代わりに評価のコピーに置き換えられるということですget_IsRoot()
。
プロパティがC#でインライン化されている場合(または場合)、およびパフォーマンス指向のアプリケーションの場合、プロパティを回避する必要があるかどうかを誰かが説明できますか?
EDIT_1 : 簡単な答えは次のとおりです。プロパティは純粋な関数呼び出しに変換され、JIT の決定に応じてインライン化される場合とされない場合があります。プロファイラーが使用され、最終結果がパフォーマンスのために微調整されない限り、システムが正しい選択を行うことを信頼し、5% から 10% のレベルで物事に影響を与える可能性があることについて心配する必要はありません。
リンクの SO コミュニティに感謝します。複数の正解を与える方法があったことを願っています。申し訳ありませんが、1つを選択する必要がありました。
java - Javaコンパイラがコードを最適化するように誘導または支援する方法は?
コードが不明確または不適切に記述されているために、Javaコンパイラのどの最適化が通常ブロックされる(または検出されない)可能性があるのか、コンパイラのコードをわかりにくくするためにどのような一般的な間違いが行われるのか疑問に思います。
c++ - コンパイラーが最適化タスクを支援するためのヒント
「Surviving the Release Version」の記事のconst と volatileの章で、コンパイラがconstキーワードを最適化ジョブのヒントとして使用できるという考えが浮かびました。
コンパイラーが関数をインライン化できるようにするための、コンパイラーまたは関数の設計原則に関する他の最適化のヒントをいくつか知っていますか?
ところで、プリミティブ型の関数のパラメータは、const や const 参照 (や のように) として宣言していますvoid foo(const int i)
かvoid foo(const int& i)
?
ありがとう!
c++ - C/C++ でのアセンブリ言語の使用
コードの特定のセクションを実際に最適化して高速化するために、プログラマーがそのセクションをアセンブリ言語で記述することをどこかで読んだことを覚えています。私の質問は -
- この練習は今でも行われていますか?どうやってこれを行うのですか?
- アセンブリ言語で書くのは少し面倒で古臭くありませんか?
- C コードを (-O3 フラグの有無にかかわらず) コンパイルすると、コンパイラはコードの最適化を行い、すべてのライブラリをリンクし、コードをバイナリ オブジェクト ファイルに変換します。したがって、プログラムを実行すると、プログラムはすでに最も基本的な形式、つまりバイナリになっています。では、「アセンブリ言語」を誘導することはどのように役立つのでしょうか?
私はこの概念を理解しようとしています。ヘルプやリンクは大歓迎です。
更新: dbemerlin の要求に応じてポイント 3 を言い換えます。コンパイラが生成するよりも効果的なアセンブリ コードを記述できる可能性がありますが、アセンブラの専門家でない限り、多くの場合、コンパイラはほとんどの人間よりもコードを最適化するため、コードの実行はおそらく遅くなります。 .
wolfram-mathematica - Mathematica:単純化を使用して共通部分式除去と強度の低下を行う
だから最近、私はMathematicaのパターンマッチングと項の書き換えがコンパイラの最適化にどのように役立つかをいじくり回しています...ループの内部であるコードの短いブロックを高度に最適化しようとしています。式の評価にかかる作業量を減らす2つの一般的な方法は、複数回発生する部分式を識別して結果を保存し、保存された結果を後続のポイントで使用して作業を節約することです。もう1つのアプローチは、可能な場合はより安価な操作を使用することです。たとえば、私の理解では、平方根を取ると、加算や乗算よりも多くのクロックサイクルが必要になります。明確にするために、私は式を評価するのにかかる時間ではなく、式を評価するのにかかる浮動小数点演算の観点からのコストに興味があります。
私の最初の考えは、Mathematicaの単純化関数を使用して開発する問題に取り組むことでした。2つの式の相対的な単純さを比較する複雑さ関数を指定することができます。関連する算術演算に重みを使用して作成し、これに、必要な割り当て演算を説明する式のLeafCountを追加します。これは強度の低下に対処しますが、私がつまずいたのは一般的な部分式の除去です。
使用を単純化する可能な変換関数に共通部分式除去を追加することを考えていました。ただし、大きな式の場合、置き換えることができる多くの可能な部分式が存在する可能性があり、式が表示されるまでそれらが何であるかを知ることはできません。可能な置換を提供する関数を作成しましたが、少なくともドキュメントの例から、指定した変換関数は単一の可能な変換を返す必要があるようです。この制限を回避する方法について何か考えはありますか?誰かが、単純化が前進の方向性を示唆する可能性のある変換関数をどのように使用するかについてより良い考えを持っていますか?
Simplifyの舞台裏では、式のさまざまな部分でさまざまな単純化を試み、複雑さのスコアが最も低いものを返す動的計画法を実行していると思います。因数分解や収集などの一般的な代数的単純化を使用して、この動的計画法を自分で実行しようとする方がよいでしょうか。
編集:削除する可能性のある部分式を生成するコードを追加しました
CommonSubExpressionsによって返されるリストから共通部分式が選択されると、置換を行う関数は次のようになります。
この質問が長くなるリスクを冒して、簡単なサンプルコードを作成します。最適化しようとする適切な式は、微分方程式を解くための古典的なルンゲクッタ法だと思いました。
最後に、さまざまな式の相対的なコストを判断するためのコードを以下に示します。それはまだ私が研究している領域であるため、重みはこの時点で概念的です。
scheme - 末尾再帰スキーム関数が正しく最適化されているかどうかを確認するにはどうすればよいですか
基本的なフォームが次のようなScheme関数があります
これは明らかに、コンパイルの繰り返しに合わせて最適化する必要があるもののように感じますが、(チキンを使用して) コンパイルすると、それでも信じられないほど遅く実行されます。(R5RS の仕様を理解している場合: http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r5rs-html.old/r5rs_22.html、これは動作するはずです)
Python で while ループを使用してまったく同じアルゴリズムを作成し、解釈されたプログラムは数秒で終了しました。コンパイルされたスキームには約 15 分かかりますが、アルゴリズムは同じであると確信しています。
他に何が考えられるのか考えられないので、これは最適化されていない末尾再帰の問題だと思いますが、それを理解することはできません。何か案は?var はハッシュであり、破壊的な更新は単に要素を追加するだけですが、newvar として渡される更新されたハッシュも返します。
c - C コンパイラは呼び出し前後のデータをプリフェッチできますか?
プリフェッチを使用してコードを最適化し、関数呼び出しの前にプリフェッチを配置するために、高度な最適化を有効にした優れた C コンパイラは可能ですか?
そのため、次のように、コンパイラの最適化後にコードを記述して、フィールドのプリフェッチを行い、呼び出しabc
よりも上に移動できます。function_first()
関数function_first()
には注釈を付けることができますclean
(field1 以外の abc フィールドに副作用はありません)。または、プログラムをプログラム全体の最適化 (インテルの場合は -ipo /Qipo) でコンパイルすることができfunction_first
ます。
更新:呼び出しなしでプリフェッチは可能ですが、この質問は呼び出しとプリフェッチの混合に関するものです
ありがとう。
c - Cの「インライン」キーワードの代替
私のコースインストラクターから、彼は繰り返し強調し、関数に「インライン」キーワードを使用しないように求めてきました。彼は、コンパイラ間で「移植可能」ではなく、「標準」でもないと述べています。これを考慮して、「インライン展開」を可能にする「標準」の代替手段はありますか?
c++ - プログラマーはいつEmpty Base Optimization (EBO)を使用しますか?
Empty Base Optimization (EBO) について読んでいました。読んでいて、次のような疑問が頭に浮かびました。
派生クラスに何も貢献しない場合 (機能的にもデータ的にも)、空のクラスを基本クラスとして使用するポイントは何ですか?
この記事で、私はこれを読みました:
//S は空
のクラス struct T : S
{
int x;
};[...]
データやコードの精度は失われていないことに注意してください。タイプ S のスタンドアロン オブジェクトを作成する場合、オブジェクトのサイズは以前と同様に 1 (またはそれ以上) のままです。S が別のクラスの基本クラスとして使用される場合にのみ、そのメモリ フットプリントはゼロに縮小されます。この節約の影響を理解するには、125,000 個のオブジェクトを含むベクトルを想像してください。EBO だけで、0.5 メガバイトのメモリを節約できます。
「S」を「T」の基本クラスとして使用しない場合、必然的に 2 倍のメガバイトのメモリを消費するということですか? この記事は、私が正しくないと思う 2 つの異なるシナリオを比較していると思います。
EBOが有用であると証明できる実際のシナリオを知りたいです。
回答に次のような説明が含まれている場合は注意してください。
全体的なポイントは、空のクラスのサイズがゼロではないということですが、派生または派生するときにサイズがゼロになる可能性があるため、既に知っているので、それを求めていません。私の質問は、そもそも空のクラスから自分のクラスを派生させるのはなぜですか? 彼がクラスを派生せずに (空のベースなしで) 単純に記述したとしても、彼は何か途方に暮れていますか?