[前提]
・サイズは 10-100 程度
・リストの容量と中身の大きさはほぼ同じ
・用途は、更新頻度が高いイベントの配布先の管理に使う
[結果]
Arrayのforとforeachはほぼ同じ。
ArrayListでも通常のforループで回すと余り変わらない 。若干ArrayListが遅いか。
foreach、streamは遅い。foreachで2倍程度。
[Array - for]
Start : 1406987147093, End : 1406987147102, Took : 9
[Array - foreach]
Start : 1406987147122, End : 1406987147131, Took : 9
[ArrayList - for]
Start : 1406987147132, End : 1406987147142, Took : 10
[ArrayList - foreach]
Start : 1406987147142, End : 1406987147174, Took : 32
[ArrayList - stream]
Start : 1406987147174, End : 1406987147229, Took : 55
※初期容量を非常に大きくした場合
⇒foreachが大きく影響を受ける。
[Array - for]
Start : 1406987109799, End : 1406987109809, Took : 10
[Array - foreach]
Start : 1406987109826, End : 1406987109835, Took : 9
[ArrayList - for]
Start : 1406987109835, End : 1406987109845, Took : 10
[ArrayList - foreach]
Start : 1406987109845, End : 1406987110117, Took : 272
[ArrayList - stream]
Start : 1406987110118, End : 1406987110526, Took : 408
import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ListAndArray { private final int SIZE = 20; private final int OUTER_COUNT = 100000; private ExecutorService executer = Executors.newFixedThreadPool(SIZE); public static void main(String[] args) { ListAndArray instance = new ListAndArray(); instance.calcListVsArray(); } public void calcListVsArray() { // initialize Listlist = new ArrayList<>(SIZE); for (int i = 0; i < SIZE; i++) { list.add(new EventListenerSample()); } EventListenerSample[] array = list.toArray(new EventListenerSample[list.size()]); long startTime; long endTime; long miliExecTime; // calc System.out.println("[Array - for]"); startTime = System.currentTimeMillis(); for (int outer = 0; outer < OUTER_COUNT; outer++) { for (int i = 0; i < SIZE; i++) { array[i].getLocalDateTime(); } } endTime = System.currentTimeMillis(); miliExecTime = endTime - startTime; System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime); System.out.println("[Array - foreach]"); startTime = System.currentTimeMillis(); for (int outer = 0; outer < OUTER_COUNT; outer++) { for (EventListenerSample eventListenerSample : array) { eventListenerSample.getLocalDateTime(); } } endTime = System.currentTimeMillis(); miliExecTime = endTime - startTime; System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime); System.out.println("[ArrayList - for]"); startTime = System.currentTimeMillis(); for (int outer = 0; outer < OUTER_COUNT; outer++) { for (int i = 0; i < SIZE; i++) { list.get(i).getLocalDateTime(); } } endTime = System.currentTimeMillis(); miliExecTime = endTime - startTime; System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime); System.out.println("[ArrayList - foreach]"); startTime = System.currentTimeMillis(); for (int outer = 0; outer < OUTER_COUNT; outer++) { for (EventListenerSample eventListenerSample : list) { eventListenerSample.getLocalDateTime(); } } endTime = System.currentTimeMillis(); miliExecTime = endTime - startTime; System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime); System.out.println("[ArrayList - stream]"); startTime = System.currentTimeMillis(); for (int outer = 0; outer < OUTER_COUNT; outer++) { list.stream().forEach(e -> e.getLocalDateTime()); } endTime = System.currentTimeMillis(); miliExecTime = endTime - startTime; System.out.printf("Start : %d, End : %d, Took : %d %n", startTime, endTime, miliExecTime); } public static class EventListenerSample { private Integer integer = Integer.MAX_VALUE - 1; private String b = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; private String c = "ccccccccccccccccccccccccccccccc"; private LocalDateTime localDateTime = LocalDateTime.now(); public LocalDateTime getLocalDateTime() { return localDateTime; } } }