質問

私が言及しているのは この議論. 。私は C または C++ でコードを書いたことはありません。私にはCSのバックグラウンドはありません。しかし、私は Java 開発者として 5 年間働いており、今は CS についてもっと学び、追いつくことにしました。

役に立ちましたか?

解決

は、実行時間がその関数に含まれるコードをダンプよりもわずかに高い標準関数を呼び出すたびに、コードの所定の部分を実行する場合。それは明らかにコードの重複の全体の混乱につながるため、全体のコードは、関数内に含まれるすべての時間をダンプすると、他のエンドunmainteinableです。

のインライン化は(++、少なくともCで)のインラインのよう関数を宣言させることで、パフォーマンスと保守性の問題を解決し、あなたはその関数を呼び出すときになるように - 代わりになるの実行時に、周りのジャンプあなたのアプリ - 。インライン関数のコードはコンパイル時に指定した関数が呼び出されるたびに注入された。

これの欠点は、それがある - あなたのインライン大きな関数がどのあなたは多くの時間を呼び出す場合 - あなたのプログラムのサイズが大幅に増加する(のベストプラクティスの実にわずかな機能でそれを行うことをお勧め)ます。

他のヒント

http://en.wikipedia.org/wiki/Inliningする

は、コンピューティング、インライン展開、またはインライン化では、呼び出し先の本体で関数呼び出しサイトを置き換えるコンパイラの最適化です。この最適化は、最終的なプログラムのサイズを大きくすることの可能なコストで、実行時に時間と空間の使用率を向上させることがあります。

Java開発者として、あなたは一般的にメソッドのインライン化を心配する必要はありません。 Javaのジャストインタイムコンパイラは、それが理にかなっているほとんどの場所で自動的にそれを行いますすることができます。

EclipseのようなIDEを使用すると、ソースコードレベルでメソッドをインライン化することを可能にする機能を持つことができます - あなたは方法は一つだけを呼び出すことを認識したときに、のことはありませんの唯一のコードの読みやす(例えばのために、パフォーマンスのためにこれを行います何でも便利自体)を追加することなく、他の方法でます。

ノルマンMaurer 説明で ブログ JVM、JITインライン機能のような

Inliningこの技法は、基本的にはただの"インライン"一つの方法が別なんのメソッドの呼び出し. のJIT自動的に検出し"温泉"方法としてインラインなっています。 方法が考える"湯"った場合に実行され、X、Xはしきい値とすることができるJVMのフラグが起java(10000のデフォルト)。このなによりも必要とされているinliningすべてのメソッドが危害そしてなんといっても、その生のバイトコードです。この他に、JITが"元に戻す"前inlinedコードが最適化すること間違った後の状態です。記憶のJITに立つだけの時間などを最適化するinliningものその他のもの)が実行を行うコードです。

も警告を発す

もっともだからと言って、JVMの検討方法は"温泉"ではインラインです。でも、なぜでしょう?最る理由である ただ大きくinlined.

で非常に簡単なコード例inlining Javaコードで Eva Andreasson's"ドキュメンテーションシステムポスト.の関連のポストです。

多くの最適化を少しでも解消できる機械のレベルに飛び指示(例えば、JMPのためのx86築).ジャンプ命令の変更の指導のポインタの登録を転送し実行フローです。この高級操作またはその他の組立て説明書が入ってるので、ぜひ歩いてみることを共通の目標を低減. 非常に有用な知名度を最適化する目標をこれinlining. 年ジャンプが高価なので、これからのインラインの多くは頻繁に電話小さな方法で、異なる入力アドレスの呼び出します。Javaのコードに上場3-5例のinlining.

上場3.呼び出し側方法

int whenToEvaluateZing(int y) {
   return daysLeft(y) + daysLeft(0) + daysLeft(y+1);
}

上場4.メソッド呼び出し時に実行され

int daysLeft(int x){
   if (x == 0)
      return 0;
   else
      return x - 1;
}

上場5.Inlined方法

int whenToEvaluateZing(int y){
   int temp = 0;

   if(y == 0) temp += 0; else temp += y - 1;
   if(0 == 0) temp += 0; else temp += 0 - 1;
   if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;

   return temp; 
}

載の3-5、呼び出し側のメソッドにして、して、電話を 小さな方法を想定していまこの例ではの地酒。 有益なインラインにジャンプします。

いてもさほど変わらなるインライン手法と呼ばれる ながinliningについては、いわゆる"温泉"方法とは と呼ばれることを意味巨大なためにのみ利用いたします。-Inliningも 頻繁にしているさらなる最適化を行うとして上場6.

上場6.後inlining、より最適に適用でき

int whenToEvaluateZing(int y){
   if(y == 0) return y;
   else if (y == -1) return y - 1;
   else return y + y - 1;
}

他の回答ですでに述べたように、インライン化にはコストがかかります。通常、これは小さいと考えられますが、実際に測定すると、得られる値よりも大きい可能性があることに驚かれるかもしれません(つまり、 他の人が言うこと は本当です:測定しない限り最適化しないでください)。

Linux カーネルでは、コストが高すぎるため、しばらく前に元々インライン化されていた関数の非インライン化が開始されたことは注目に値します (大きな関数はより多くの CPU メモリ キャッシュを消費し、その結果として生じるキャッシュ ミスは単に関数を呼び出すよりもコストが高かった)インライン化することを意図したものです)。「第 15 章:」を参照してください。インライン病」 doc/Documentation/process/coding-style.rst 詳細については。

基本的には、C / C ++で、コンパイラは決してなかったかのようにそれが可能になるので、むしろその操作を行うには、関数呼び出しを行うよりも、コードは、呼び出し元の関数のブロックに追加されることを意味し、関数をインラインすることができます別の関数を呼び出しています。

これは、より詳細になります。 http://www.codersource.net/cpp_tutorial_inline_functions.htmlする

インラインコードの小さな関数は別のコールを必要とするのではなく、呼び出し元の関数に注入されるコンパイル時のための最適化を意味する。

コンパイラの最適化の答えは正しいです。しかし別の使用法がある - のリファクタリングは、インライン展開は、本体とメソッド呼び出しを置き換えることをいいますこの方法の、その後除去方法。 インラインメソッドを参照してください。このようインラインクラスのと同様のリファクタリングは、あります。

EDIT:なお、リファクタリングを手動またはツールを用いて行われます。いずれの場合では、ソースコードを変更することを含む。

インライン関数は、C ++のヘッダファイルではないJavaで一般的に使用されています。 C ++ヘッダファイルは、通常、実装されたコードが含まれていないと通常実装されたコードを含むない同じ名前のCPPファイルへのインターフェースであると考えられます。ヘッダー・ファイル内のインライン関数、通常、小型軽量の機能を含めることが合法です。インライン関数はコストで来るんので、彼らは、大容量メモリ集中型の操作ではありません。小さなルーチンのパフォーマンスヒットは最小限であり、それらは便宜的に、より使用されています。

JIT(ジャストインタイム)コンパイラは、時間ベースの拡張機能をもたらすために許可されている場合は、

その議論では、ジョンスキートは、実行時に利用可能なパフォーマンスの向上とクライアントJVM(ホットスポット)vサーバーJVMに言及しています。これは、Javaで、「どのように行うの」です。

もともと、多くの場所から呼び出されていなかったコードの小さなセクションでは、コンパイラによって「インライン化」されるだろう、何をシングルトンと呼ばれていましたが、機能ブランチをやって、命令ポインタコードパスに直接配置し、コストを返すことになることを意味ちょうど「右が」ループや関数呼び出しにアンロールと命令を置くよりも多くのプロセッサパワー

今日、シングルトンは、マルチページの議論とループアンローリングの主題ならびにインラインのようなものが多少元のコンテキスト(S)から削除されています。あなたは問題を取るC ++ / Cを取得する問題についてドブBulkaの非常に情報に基づいた作品を読むことができます。あなたは16ビットコードへの呼び出しをごまかすデータ構造、上定着し四面楚歌学内戦に掛け得ることができ、そして - Javaの場合、それの研究では、より良いインライン化と深いコンパイラの問題の研究よりも、あなたのニーズに役立つであろうjava.utilのLIB用の豊富なのですあなたの学習曲線には終わりに行きません。

あなたはJavaでのinstanceof行うことができ、それは、VF-テーブルに似ている(無熱の人々、してください)しかし、あなたは強く型付けされた言語で書いているようなものだと思う - 今文字列が暴走することができます言語で書くことになります簡単にそれが何のビジネスを持っていない場所の周り突っつい。私は最近、Cコードからそれをやって、Javaで画像を構築し、コードを記述してみました。私が書いたコードとは何の関係もありません - 私はすぐに自分自身が強力な暗号化のためのOXRテーブルを見ていました。

どのように彼らは文字列のみで動作するように32のバイトとトラップポインタの下に文字列の小さなバッファを持っているC / C ++での文字列クラスを書くのでしょうか?

あなたか何かをいじめるしようとしていないが、それだけで本当に良いスタートする場所ではなく、インライン化およびコンパイラの科学です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top