Мне сказали, что Java Stream - хороший выбор для обработки большого количества данных, и недавно я провел сравнительный тест. Однако результат теста неожиданный:
Вопрос от CodeWar:
Предположим, что изначально есть метро с 100 людьми, на каждой остановке в метро находятся несколько человек и несколько человек. вне. Цель состоит в том, чтобы подсчитать количество людей, оставшихся в метро после большого количества остановок (100000).
Вот мой код:
import java.util.ArrayList;
public class Metro1 {
private final static int STOPS = 100000;
private static ArrayList<int[]> metro = new ArrayList<int[]>();
public static int sum1() {
int sum = 0;
for(int[] x: metro) {
sum +=x[0] - x[1];
}
return sum;
}
public static int sum2() {
return metro.stream()
.mapToInt(x -> x[0]-x[1])
.sum();
}
public static void main(String[] args) {
long start=0;
long end = 0;
metro.add(new int[] {100,0});
for(int i=1;i<STOPS;i++) {
int in = (int) Math.round(Math.random() * 10);
int out = (int) Math.round(Math.random() * 10);
metro.add(new int[] {in,out});
}
System.out.println("Stops: " + metro.size());
start = System.currentTimeMillis();
System.out.println("sum1: " + sum1());
end = System.currentTimeMillis();
System.out.println("sum1 (for loop): " + String.valueOf(end-start) + " milliseconds.");
start = System.currentTimeMillis();
System.out.println("sum2: " + sum2());
end = System.currentTimeMillis();
System.out.println("sum1 (stream): " + String.valueOf(end-start) + " milliseconds.");
}
}
Я запустил код в Eclipse и я обнаружил, что sum1 намного быстрее, чем sum2:
Stops: 100000
sum1: 79
sum1 (for loop): 6 milliseconds.
sum2: 79
sum1 (stream): 68 milliseconds.
Я думал, что код достаточно прост, но почему поток медленнее, чем для l oop?
Спасибо,
Алекс