問題タブ [inlining]
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.
.net - .NET JIT は、別の小さな関数を呼び出す小さな関数をインライン化しますか?
知りたいのですが、.NET JITter は、他の小さな関数から呼び出された小さな関数を再帰的にインライン化しますか?
ちょうど例:
どこかから呼び出すCube
と、インライン化されますか、それとも への関数呼び出しになりSquare
ますか?
もしそうなら、インライン化を行うためにどれくらい深く再帰しますか? (私が同じ方法でQuartic
orQuintic
関数を実装するのに十分夢中だったとしましょう。)
c# - C# での CSS のインライン化
c# でスタイルシートから css をインライン化する必要があります。
これがどのように機能するかのように。
http://www.mailchimp.com/labs/inlinecss.php
CSS はシンプルで、クラスのみで、派手なセレクターはありません。
正規表現を使用し(?<rule>(?<selector>[^{}]+){(?<style>[^{}]+)})+
てCSSからルールを削除し、クラスが呼び出される場所で単純な文字列を置き換えようと考えていましたが、一部のhtml要素にはすでにスタイルタグがあるため、それを考慮する必要があります良い。
より簡単なアプローチはありますか?または、すでに c# で書かれているものですか?
更新 - 2010 年 9 月 16 日
html も有効な xml であれば、単純な CSS インライナーを思いつくことができました。正規表現を使用して、<style />
要素内のすべてのスタイルを取得します。次に、css セレクターを xpath 式に変換し、既存のインライン スタイルの前に、スタイル インラインを一致する要素に追加します。
CssToXpath は完全には実装されていないことに注意してください。まだ実行できないことがいくつかあります。
CssInliner.cs
CssToXpath.cs
そしていくつかのテスト
もっと多くのテストがありますが、それらは入力と期待される出力のために html ファイルをインポートします。
しかし、Normalize 拡張メソッドを投稿する必要があります。
.net - メソッドが CLR によってインライン化されるのはいつですか?
アプリケーションで多くの「スタック内省的」コードを観察してきました。これらのコードは、多くの場合、含まれているメソッドがインライン化されていないことに暗黙的に依存しています。このようなメソッドには、通常、次の呼び出しが含まれます。
MethodBase.GetCurrentMethod
Assembly.GetCallingAssembly
Assembly.GetExecutingAssembly
現在、これらの方法に関する情報は非常に紛らわしいと思います。ランタイムは GetCurrentMethod を呼び出すメソッドをインライン化しないと聞いたことがありますが、その効果に関するドキュメントは見つかりません。CLR がクロスアセンブリ呼び出しをインライン化しないことを示す、このような StackOverflow に関する投稿をいくつか見てきましたが、GetCallingAssembly
ドキュメントはそれ以外のことを強く示しています。
非常に悪名高い もありますが[MethodImpl(MethodImplOptions.NoInlining)]
、CLR がこれを「要求」または「コマンド」と見なすかどうかはわかりません。
契約の観点からのインライン化の適格性について質問していることに注意してください。JITter の現在の実装が実装の問題のためにメソッドを検討することを拒否する時期や、JITter が取引を評価した後に最終的に適格なメソッドをインライン化することを最終的に選択する時期についてではありません。オフ。私はthisとthisを読みましたが、最後の 2 つの点により焦点を当てているようです (MethodImpOptions.NoInlining と「エキゾチックな IL 命令」についての言及がありますが、これらは義務としてではなくヒューリスティックとして提示されているようです)。
CLRをインライン化できるのはいつですか?
c++ - 式テンプレートが完全にインライン化されていない
数学ライブラリの最初のバージョンが完成しました。次のステップでは、式テンプレートを使用してコードのパフォーマンスを向上させたいと考えています。しかし、私の最初の結果は、私が予想したものとは異なります。MSVC 2010 でバニラ リリース モードでコンパイルしています (C++0x でも問題ありません)。
大量のコードをお見せすることを前もってお詫びします。私がやっていることを人々に見てもらいながら、できる限り最小限のものです。プロファイリング フレームワーク:
式テンプレート ベクトル:
手動インライン化:
結果:
式テンプレート:
合計時間: 14.172 平均時間: 0.29525
分: 0.281 最大: 0.422手動インライン化:
合計時間: 8.438 平均時間: 0.175792
分: 0.171 最大: 0.188
ご覧のとおり、式テンプレートは (明らかに) 完全にインライン化されたコードにはなっていません。test()
の最後の呼び出しへの逆アセンブルは次のstd::clock()
とおりです。
式テンプレート アセンブリ:
手動インライン アセンブリ:
結論: 何らかの理由で、MSVC2010 は への呼び出しをインライン化しませんoperator+
。これがなぜなのか誰か知っていますか?パッティング__forceinline
(私は避けたい)でもインライン化されません。
更新: jdv-Jan de Vaan が言及したように、デストラクタを削除すると:
インライン化しoperator+
ます。奇妙なことは、それが別のアセンブリにインライン化されていることです。私のテストでは、この出力がオリジナルよりも優れたパフォーマンスを示していますが、手動でインライン化されたバージョンと同じステータスには達していません。それはなぜですか?
haskell - IOアクションでの純粋な式の繰り返し評価
(a) IO を実行し、(b) ルックアップ テーブルを作成し、(c) ルックアップ テーブルを使用する IO アクションを返すプロシージャがあります。しかし、 でコンパイルすると-O
、GHC (バージョン 6.12.1) はルックアップ テーブルの構築をインライン化し、IO アクションの呼び出しごとに再評価されるようにします。
例:
この問題は、標準的な GHC の絶対確実な回避策があるほどよく知られていますか? または、a
繰り返し割り当てられないようにプログラムをどのように調整しますか?
c# - 参照された dll のメソッドのコードが自分のコードでインライン化される可能性はありますか?
少し前に、「インライン化」について読んだことがあります。.Net コンパイラは、小さなメソッドからコード (インライン) を挿入して実行を高速化します。
参照された dll のメソッドのコードが自分のコードでインライン化される可能性はありますか?
c# - メソッドでのJITインライン化の防止
ある種の独特な状況があります。私は電子メールを送信するためのオープンソースライブラリに取り組んできました。このライブラリでは、呼び出し元のメソッドを取得するための信頼できる方法が必要です。私はその中のオブジェクトをStackTrace
分析することによってこれを行いました。StackFrame
これは、最適化がオフになっているデバッグモードプロジェクトでは問題なく機能します。
この問題は、最適化がオンになっているリリースモードに切り替えると発生します。スタックトレースは次のようになります。
これは、失敗した単体テストから取得されます。このトレースの3行目には、TestEmail
他の場所で定義されているというメソッドが表示されているはずですが、JITterがそれをインライン化していると思います。メソッドを仮想化することでインライン化を防ぐことができると読みましたが、これは機能しません。メソッドのインライン化を防ぎ、メソッドがスタックトレースに表示されるようにするための、信頼できる方法を知っている人はいますか?
c++ - C / C ++コンパイラがCコールバック関数をインライン化できる方法はありますか?
C-StdlibのようなコールバックとしてC-Functionpointerを受け取る典型的な関数を考えると、qsort()
どのコンパイラーもインライン化を使用してコードを最適化できますか?できないと思いますが、これは正しいですか?
さて、外部ライブラリの関数ですが、 LTOqsort()
でさえここでは役に立たないと思いますよね?
しかしmy_qsort()
、同じコンパイルユニットで定義した場合、コンパイラでインライン化は可能でしょうか?
それは何か違いがありますか?コールバックとしてのC関数ポインターの使用は、コンパイラーがインライン化するのを妨げる要因だと思います。正しい?
( C ++でFunctorsを使用する理由を確実に理解したいだけです)
c++ - コンパイル時の C/C++ 関数の複製
関数 がある場合、名前だけが異なるだけで、とまったく同じ機能を持つA()
関数を作成する便利な方法を見つけることに興味があります。新しい機能は 1 回限りの使用です。その意図は、やや原始的なサンプリング プロファイラーで同じ関数の呼び出しを区別することであり、複製された関数はこのコンテキストでのみ使用されます。つまり、本番コードに触れることはなく、いじくり回しにのみ使用されます。B()
A()
最初に推測されるのは、という名前の関数を宣言し、その内部B
へのインライン呼び出しを作成するマクロです。A()
ここでの問題は、インラインへの任意の関数呼び出しを強制する GCC のメソッドを認識していないことです。すべてのインライン化オプションは、呼び出しではなく関数宣言用のようです。
テンプレートを使用するか、コンパイラをだましてインライン化することによって、それを行う難解な方法があるかもしれません。可能かどうかわかりません。何かご意見は?残念ながら、違いがあるとしても、新しい C++ 標準は利用できません。
optimization - すべてのラムダ引数は F# で自動的にインライン展開されますか?
F# News のこの投稿では、F# は引数として渡された関数をインライン化できると述べています。いつもそうですか?それは自動的に起こりますか?