Help us understand the problem. What is going on with this article?

List#toArray の 引数って size と0 どっちがはやいの?

More than 1 year has passed since last update.

まず結論

  • toArray(new T[0]) の方がはやいっす。

経緯

  • list.toArray は size の方がパフォーマンスがいい!と覚えていた。
  • ちょっとググると、内部実装を踏まえ、そのように書いてあるページばかりだ。

  • しかし、VMのパフォーマンスも日々進化している。

  • 2018/05/31 現在において、本当にそうなのだろうか。

→ 実験してみよう!

前提

  • ランタイムのバージョンや実行環境によって、後述の限りではないので、鵜呑みにしないで下さい。
  • 内部実装は見てません。

実験コード

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            list.add(Integer.toString(i));
        }

        int[] loopCounts = new int[] { 1000, 10000, 100000, 1000000, 10000000 };
        for (int loop : loopCounts) {
            long sum = 0;
            for (int j = 0; j < 10; j++) {
                long start = System.currentTimeMillis();

                String[] temp = null;
                for (int i = 0; i < loop; i++) {
                    temp = list.toArray(new String[0]);
                }

                long stop = System.currentTimeMillis();
                sum += stop - start;
            }
            System.out.println("toArray(new String[0]) " + loop + "回の速度*10回の平均速度は " + sum / 10 + " ミリ秒です。");

            sum = 0;
            for (int j = 0; j < 10; j++) {
                long start = System.currentTimeMillis();

                String[] temp = null;
                for (int i = 0; i < loop; i++) {
                    temp = list.toArray(new String[list.size()]);
                }

                long stop = System.currentTimeMillis();
                sum += stop - start;
            }
            System.out.println("toArray(new String[list.size()]) " + loop + "回の速度*10回の平均速度は " + sum / 10 + " ミリ秒です。");
        }
    }
}

結果

【1,000回】

toArray(new String[0]) 1000回の速度*10回の

平均速度は 2 ミリ秒です。

toArray(new String[list.size()]) 1000回の速度*10回の

平均速度は 2 ミリ秒です。

【10,000回】

toArray(new String[0]) 10000回の速度*10回の

平均速度は 19 ミリ秒です。

toArray(new String[list.size()]) 10000回の速度*10回の

平均速度は 25 ミリ秒です。

【100,000回】

toArray(new String[0]) 100000回の速度*10回の

平均速度は 207 ミリ秒です。

toArray(new String[list.size()]) 100000回の速度*10回の

平均速度は 288 ミリ秒です。

【1,000,000回】

toArray(new String[0]) 1000000回の速度*10回の

平均速度は 1497 ミリ秒です。

toArray(new String[list.size()]) 1000000回の速度*10回の

平均速度は 1562 ミリ秒です。

【10,000,000回】

toArray(new String[0]) 10000000回の速度*10回の

平均速度は 12949 ミリ秒です。

toArray(new String[list.size()]) 10000000回の速度*10回の

平均速度は 15622 ミリ秒です。

改めて結論

toArray(new T[0]) の方がはやい!

あとがき

ネットでググって出てきた記事に書いてあるから ってのはアカンなぁ(自戒)

参考になりそうなURL

外部リンク:Arrays of Wisdom of the Ancients

kageryosan
技術は目的じゃなくて手段だと思う。けれどいつかその手段が目的達成の為に必要になるから学び続ける。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away