2011-10-25 11 views
2

私は次の2つの関数を正確に同じバイトコードにコンパイルしていると推測していますが、私は質問してください。パフォーマンスを低下させる必要のないメソッド呼び出しを修飾しますか?例えばメソッド呼び出しを修飾すると、Javaのパフォーマンスが低下しますか?

は:

package com.my; 

import android.app.Activity; 
import android.os.Bundle; 

public class Main extends Activity { 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     this.setContentView(R.layout.main); // Fully qualified 
     setContentView(R.layout.main);  // Not fully qualified 
    } 

} 

標準は、後者を使用することであるが、完全修飾されたコールthis.setContentView()は、任意の負の影響はありますか?

+0

より具体的なものは決して*性能*を低下させるべきではありません。 –

+0

もし私がもう一度質問をしたら、私は命題を逆にするでしょう。あなたは正しいです。 – styler1972

答えて

9

いいえ、違反はありません。両方の呼び出しは、バイトメソッド内でinvokespecialを使用して、メンバーメソッドを呼び出します。

public class TestQualified { 

    private void someMethod() { 
    } 

    public void otherMethod() { 
     this.someMethod(); 
     someMethod(); 
    } 
} 

には、次のバイトコード生成:標準のJava、次のコードで

あなたが見ることができるように

Compiled from "TestQualified.java" 
public class TestQualified extends java.lang.Object{ 
public TestQualified(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

private void someMethod(); 
    Code: 
    0: return 

public void otherMethod(); 
    Code: 
    0: aload_0 
    1: invokespecial #2; //Method someMethod:()V 
    4: aload_0 
    5: invokespecial #2; //Method someMethod:()V 
    8: return 

} 

を、両方の呼び出しは同じです。

今のAndroidは.dexファイルを出力dxツールを使用してのDalvikバイトコードに.classファイルを変換します。

Processing 'TestQualified.dex'... 
Opened 'TestQualified.dex', DEX version '035' 
Class #0   - 
    Class descriptor : 'LTestQualified;' 
    Access flags  : 0x0001 (PUBLIC) 
    Superclass  : 'Ljava/lang/Object;' 
    Interfaces  - 
    Static fields  - 
    Instance fields - 
    Direct methods - 
    #0    : (in LTestQualified;) 
     name   : '<init>' 
     type   : '()V' 
     access  : 0x10001 (PUBLIC CONSTRUCTOR) 
     code   - 
     registers  : 1 
     ins   : 1 
     outs   : 1 
     insns size : 4 16-bit code units 
0000e4:          |[0000e4] TestQualified.<init>:()V 
0000f4: 7010 0300 0000       |0000: invoke-direct {v0}, Ljava/lang/Object;.<init>:()V // [email protected] 
0000fa: 0e00         |0003: return-void 
     catches  : (none) 
     positions  : 
     0x0000 line=1 
     locals  : 
     0x0000 - 0x0004 reg=0 this LTestQualified; 

    #1    : (in LTestQualified;) 
     name   : 'someMethod' 
     type   : '()V' 
     access  : 0x0002 (PRIVATE) 
     code   - 
     registers  : 1 
     ins   : 1 
     outs   : 0 
     insns size : 1 16-bit code units 
0000fc:          |[0000fc] TestQualified.someMethod:()V 
00010c: 0e00         |0000: return-void 
     catches  : (none) 
     positions  : 
     0x0000 line=4 
     locals  : 
     0x0000 - 0x0001 reg=0 this LTestQualified; 

    Virtual methods - 
    #0    : (in LTestQualified;) 
     name   : 'otherMethod' 
     type   : '()V' 
     access  : 0x0001 (PUBLIC) 
     code   - 
     registers  : 1 
     ins   : 1 
     outs   : 1 
     insns size : 7 16-bit code units 
000110:          |[000110] TestQualified.otherMethod:()V 
000120: 7010 0200 0000       |0000: invoke-direct {v0}, LTestQualified;.someMethod:()V // [email protected] 
000126: 7010 0200 0000       |0003: invoke-direct {v0}, LTestQualified;.someMethod:()V // [email protected] 
00012c: 0e00         |0006: return-void 
     catches  : (none) 
     positions  : 
     0x0000 line=7 
     0x0003 line=8 
     0x0006 line=9 
     locals  : 
     0x0000 - 0x0007 reg=0 this LTestQualified; 

    source_file_idx : 3 (TestQualified.java) 

あなたは両方のコールがinvoke-directを使用して作られていることを見ることができます:.classファイルが2回の呼び出しの間の任意の区別を示していないので、対応する.dexファイルは、いずれかの差は表示されません。したがって、ここでもパフォーマンスペナルティはありません。

+2

素敵な説明、答えをありがとう – styler1972

1

いいえ、それはありません。これはコンパイラにとってはまったく同じです。 thisの参照を読むヘルプとして見ることができます。java7 number literals

関連する問題