Что работает потенциально быстрее: for или forEach?
for (Object item : items) { ... }
// VS
items.forEach(item -> { ... });
Логика мне подсказывает, что между ними нет разницы (вообще). Интуитивно кажется, что если кто-то и будет быстрее, то for.
Попробовал запустить такой тест:
public class TestApplication {
public static void main(final String[] args) {
final List<String> items = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
items.add(String.format("Item #%d", i));
}
final AtomicInteger payload = new AtomicInteger();
// test 1
long testStart = System.currentTimeMillis();
for (final String item : items) {
payload.addAndGet(1);
}
long testStop = System.currentTimeMillis();
System.out.println(String.format("Test 1 (for): %d", testStop - testStart));
// test 2
testStart = System.currentTimeMillis();
items.forEach(item -> {
payload.addAndGet(1);
});
testStop = System.currentTimeMillis();
System.out.println(String.format("Test 2 (forEach): %d", testStop - testStart));
// test 3
testStart = System.currentTimeMillis();
for (final String item : items) {
payload.addAndGet(1);
}
testStop = System.currentTimeMillis();
System.out.println(String.format("Test 3 (for): %d", testStop - testStart));
// test 4
testStart = System.currentTimeMillis();
items.forEach(item -> {
payload.addAndGet(1);
});
testStop = System.currentTimeMillis();
System.out.println(String.format("Test 4 (forEach): %d", testStop - testStart));
}
}
Результат:
Test 1 (for): 171
Test 2 (forEach): 162
Test 3 (for): 162
Test 4 (forEach): 145
(вывод по результатам нескольких запусков: forEach, как правило, работает быстрее for на ~ несколько миллисекунд)
Если убрать payload (запустить пустые циклы), то результат примерно такой (forEach опять быстрее):
Test 1 (for): 76
Test 2 (forEach): 73
Test 3 (for): 78
Test 4 (forEach): 70
Если заменить ArrayList на HashSet, то результаты примерно одинаковые (то for быстрее то forEach):
Test 1 (for): 431
Test 2 (forEach): 421
Test 3 (for): 368
Test 4 (forEach): 386