2013-08-01 2 views
5

もっと速いのは何ですか? bundleに一連の文字列値を追加し、それをintentに追加しますか?または、に値を追加するだけでintent.putExtra()を使用しますか?それとも大きな違いはありませんか?より速いのは何ですか? 1つのintent.putExtras(Bundle with Strings)または多くのintent.putExtra(String)?

Google検索でチュートリアルができましたが、答えはあまりありませんでした。好奇心から尋ねて、どちらか一方を使うのがパフォーマンスに影響するかどうか疑問に思う。 Thisが近づいていますが、私が知りたいことは答えません。

答えて

4

自分でBundleを作成してから、それをインテントに追加する方が高速になります。

source codeによると、Intent.putExtra(String, String)方法は次のようになります。だから、

public Intent putExtra(String name, String value) { 
    if (mExtras == null) { 
     mExtras = new Bundle(); 
    } 
    mExtras.putString(name, value); 
    return this; 
} 

Bundle mExtrasがすでに作成された場合、それは常に最初にチェックされます。だからこそ、ストリング追加の大きなシーケンスでは、おそらく少し遅くなります。 Intent.putExtras(Bundle)は次のようになります。

public void putAll(Bundle map) { 
    unparcel(); 
    map.unparcel(); 
    mMap.putAll(map.mMap); 

    // fd state is now known if and only if both bundles already knew 
    mHasFds |= map.mHasFds; 
    mFdsKnown = mFdsKnown && map.mFdsKnown; 
} 

BundleするMapによってバックアップされている(HashMapをする:

public Intent putExtras(Bundle extras) { 
    if (mExtras == null) { 
     mExtras = new Bundle(); 
    } 
    mExtras.putAll(extras); 
    return this; 
} 

だから、それはBundle.putAll()と内部Bundle mExtrasにすべての値を追加し、後に一度だけif (mExtras == null)をチェックします正確です)、すべての文字列を一度にこのマップに追加すると、文字列を1つずつ追加するよりも速くなります。

+0

ありがとう、とにかくスタートからのバンドルを使用していた、ちょうどそれがより良いことができるかどうか疑問に思った。 – Lunchbox

+0

+1であるため、intent.putExtra()を使用して多数の文字列値を追加すると、毎回バンドルをチェックすることになりますが、バンドルを1つ追加するだけでチェックが1回だけ行われます。意味がある – Lunchbox

+0

@Lunchboxはい、まさにそうです。さらに、 'mExtras.putAll()'は 'mExtras.putString()'( 'unparcel()'呼び出しに気付く)よりも速くなければなりません。 –

関連する問題