2011-12-09 20 views
0

テスト目的のために、.classファイルを生成するためにそれぞれのコードがコンパイルされるときに特定のメソッドがインライン化されないようにする必要があります。メソッドがJavaコンパイラによってインライン化されないようにする方法は?

Eclipseでどのように行うのですか?彼らはどのようを言う前に、本当に、なぜを知っておく必要があります人のために

EDIT

は、ここでの説明である - 私が調べて、JVMバイトコードを操作するコードをテストしています。このため、メソッドのインライン展開を回避することが時々必要になります。

+0

これはテストにどのように影響しますか?機能的な違いがない場合にのみコードがインライン展開されます。表示される唯一の違いはパフォーマンスです。パフォーマンステストでは、コードを本番と同じように処理する必要があります。そうしないと、テストは無意味です。 –

+0

質問を編集しました。 – mark

+0

「方法」に応じて「なぜ」の質問を受け取ると、それは通常、「わかっていませんが、あなたが私たちにもう少し背景を与えるなら、私たちはまだ助けることができます」と推測しています。 –

答えて

1

Javaメソッドは、(実行時に最適化JVMによってのみ).classファイルを生成する際にインライン化されることはありません。したがって、何も心配はありません。

+0

ご参考までに、リファレンスがありますか? Javaの仕様などと同じですか? – mark

+0

@mark:最近、JLSやJVM仕様のどこかで読んでいるように感じますが、もう一度検索すると見つけられません。私は、メソッドがクラスファイルに存在することが保証されているだけでなく、ソースにあるのと同じ順序でなければならないという曖昧な考えを持っています。 - *これはイニシャライザブロック*です。少なくとも、[Class.getDeclaredMethods](http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredMethods%28%29)が動作する必要があります。 – Boann

+0

@mark:インラインメソッド自体のバイトコードではなく、他のメソッドをインライン展開できるメソッドのバイトコードに興味があるなら、それはあなたが意図したものではないかもしれないことに気付きました。私はそれについて正式な保証はないと思う。それは、コンパイルされていないコードが存在する場合、コンパイラが正しくインライン展開できるようです。しかし、標準のjavacは、たとえprivate static finalであっても、メソッドをインライン化しません。これはソースの生で怠惰な変換です。 – Boann

4

あなたはそうではありません。コンパイラとJITがバイトコードをどのように最適化するかをほとんど制御できません。

なぜあなたはこれをやりたいのですか?

HotSpotの-XX:MaxInlineSize=が非常に低い数に設定されている可能性があり、メソッドがインライン化されない可能性があることに注意してください。 Eclipseコンパイラには同等のオプションがあるかもしれませんが、私は注意が必要です。

+0

私はJavaバイトコードをマシンコードにコンパイルするJITについては言及していません。 – mark

+0

@マーク私は実際にJITコンパイルが何であるか知っています。コンパイラとJITがバイトコードをどのように最適化するかを制御することはほとんどなく、初期のバイトコード出力を制御する信頼性の高い、クロスコンパイラの方法や後続の最適化方法はわかりません。 –

+0

Boann(私がマークした)が提供する答えが間違っていると言いたいですか? – mark

-1

Javaインライン関数については、完全にコンパイラの気まぐれです。あなたはそれについて何も言わない。

何かをインライン化する必要があるかどうかを判断するために使用するさまざまなメトリックがあります。私は、これらのうちの1つがメソッドのバイトコード命令の数であると考えています。あなたは、このような方法で持っていたのであれば:

void foo() { 
    if(SOME_GLOBAL_BOOLEAN_THATS_ALWAYS_FALSE) { 
     // lots of statements here 
    } 
    // code here 
} 

あなたはそれがあなたの上にインライン化の可能性を減らすことができるかもしれないが、文は必ず、それを最適化するつもりではなかったにする場合は、あなたに十分賢いだった提供あなたに出てきます。

+1

実際には、現代のJITコンパイラは、グローバルを真に設定するコードがないことを検出し、実際にそのコードをコンパイルします。その値を変更するために後でクラスがロードされた場合、javaは最適化を取り除くことができます。 Java 6が好きになった。 –

+0

@couling;それは「あなたが賢明だったならば」という部分です。 – corsiKa

関連する問題