3

この記事に出くわしたとき、私はGoogleドキュメントページを読んでいましたhttp://developer.android.com/training/articles/perf-tips.html

反対の結果が得られる理由を誰か説明できますか?

私の結果は: (平均) 結果 1: 76 結果 2: 73 結果 3: 143

次のコードを使用して、いくつかのテストを実行しました(同じテストを何度もループしました)。

package TestPack;

import java.util.ArrayList;


public class Test
{
static ArrayList<Integer> mTheArray = new ArrayList<Integer>();
static
{
    for(int i = 0; i < 10000000; i++)
    {
        mTheArray.add(1234234223);
    }
}

static long mTimeStarted;
public static void main(String args[])
{
    //Test 1.
    mTimeStarted = System.currentTimeMillis();
    One();
    Fn.Out("Result 1: " + String.valueOf(System.currentTimeMillis() - mTimeStarted));

    //Test 2.
    mTimeStarted = System.currentTimeMillis();
    Two();
    Fn.Out("Result 2: " + String.valueOf(System.currentTimeMillis() - mTimeStarted));

    //Test 3
    mTimeStarted = System.currentTimeMillis();
    Three();
    Fn.Out("Result 3: " + String.valueOf(System.currentTimeMillis() - mTimeStarted));

}

//Slowest (But not...).
public static int One()
{
    int sum = 0;
    for (int i = 0; i < mTheArray.size(); ++i) 
    {
        sum += mTheArray.get(i);
    }
    return sum;
}

public static int Two()
{
    int sum = 0;
    ArrayList<Integer> localArray = mTheArray;
    int len = localArray.size();

    for (int i = 0; i < len; ++i) {
        sum += localArray.get(i);
    }
    return sum;
}

//Fastest (But actually slowest in this test).
public static int Three()
{
    int sum = 0;
    for (Integer a : mTheArray) {
        sum += a;
    }
    return sum;
}

}

4

1 に答える 1

6

リンクしたページには、具体的に次のように記載されています。

ArrayList を使用すると、手書きのカウント ループは (JIT の有無にかかわらず) 約 3 倍速くなりますが、他のコレクションでは、強化された for ループ構文は、明示的な反復子の使用とまったく同じになります。

ArrayListしたがって、デフォルトで強化された for ループを使用する必要がありますが、パフォーマンスが重要な反復には手書きのカウント ループを検討してください。

ArrayList を使用しているため、得られる結果はこのステートメントとかなり一致しているように見えます。

于 2013-05-29T23:37:53.850 に答える