LoginSignup
4
3

More than 5 years have passed since last update.

配列をリストに追加するベンチマーク

Last updated at Posted at 2016-08-31

配列をリストに追加する以下ふたつの方法のベンチマークをとってみました。

  • Collections.addAll(...)
  • List#addAll(...)Arrays.asList(...) の組み合わせ

ベンチマーク方法

  • 10000 の配列を 100 回 List に追加

結果

方法 時間(ナノ秒)
Collections 8974267
List + Arrays 2480949

List が ArrayList の場合、Collections よりも List + Arrays の方が高速でした。

実装を見ると、Collections は for ループでひとつずつ追加しているのに対し、List は System.arraycopy で追加しています。速度の差はこのためです。Collections.addAll は Collection 全般に利用できるメソッドで、かつ要素が追加されたかどうかを boolean で返すので、ループで回すのは仕方がないです。

少なくとも、自分でループを回して追加するのはやめましょう。

検証コード

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String... args) {
        String[] array = new String[10000];
        List<String> list = new ArrayList<>();

        long total1 = 0;
        for (int i = 0; i < 100; i++) {
            long start = System.nanoTime();
            Collections.addAll(list, array);
            long end = System.nanoTime();
            total1 += (end - start);
            list.clear();
        }

        long total2 = 0;
        for (int i = 0; i < 100; i++) {
            long start = System.nanoTime();
            list.addAll(Arrays.asList(array));
            long end = System.nanoTime();
            total2 += (end - start);
            list.clear();
        }


        System.out.println("total1: " + total1);
        System.out.println("total2: " + total2);
    }
}

補足

List が LinkedList の場合、Collections の方が若干速くなりました。

方法 時間(ナノ秒)
Collections 19991340
List + Arrays 21064007

ただし、こうした用途に LinkedList は向いていないので参考までに。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3