Я побежал ниже пример кода в моем компьютере работает с Intel(R) Xeon(R) CPU E5-2680 0 @ 2.70GHz (2 CPUs), ~2.7GHz
Операции с потоком Java8 кэшируются?
String format = "%7s run taken %6d micro seconds %5d findAny";
// First run
long start = System.nanoTime();
int rand = IntStream.range(0, 100000).parallel().findAny().getAsInt();
long end = System.nanoTime();
System.out.println(String.format(format, "First", ((end - start)/1000), rand));
// Subsequent runs
for (int i = 0; i < 25; i++) {
start = System.nanoTime();
rand = IntStream.range(0, 100000).parallel().findAny().getAsInt();
end = System.nanoTime();
System.out.println(String.format(format, "Subseq", ((end - start)/1000), rand));
}
выходе
First run taken 92532 micro seconds 50000 findAny
Subseq run taken 61 micro seconds 50000 findAny
Subseq run taken 37 micro seconds 50000 findAny
Subseq run taken 52 micro seconds 50000 findAny
Subseq run taken 42 micro seconds 50000 findAny
Subseq run taken 33 micro seconds 50000 findAny
Subseq run taken 32 micro seconds 50000 findAny
Subseq run taken 34 micro seconds 50000 findAny
Subseq run taken 33 micro seconds 50000 findAny
Subseq run taken 34 micro seconds 50000 findAny
Subseq run taken 32 micro seconds 50000 findAny
Subseq run taken 32 micro seconds 50000 findAny
Subseq run taken 46 micro seconds 50000 findAny
Subseq run taken 36 micro seconds 50000 findAny
Subseq run taken 31 micro seconds 50000 findAny
Subseq run taken 43 micro seconds 50000 findAny
Subseq run taken 34 micro seconds 50000 findAny
Subseq run taken 31 micro seconds 50000 findAny
Subseq run taken 32 micro seconds 50000 findAny
Subseq run taken 37 micro seconds 50000 findAny
Subseq run taken 45 micro seconds 50000 findAny
Subseq run taken 49 micro seconds 50000 findAny
Subseq run taken 32 micro seconds 50000 findAny
Subseq run taken 31 micro seconds 50000 findAny
Subseq run taken 31 micro seconds 50000 findAny
Subseq run taken 37 micro seconds 50000 findAny
мы могли видеть время, затрачиваемое разницу между первыми и последующими запусками.
- Это означает, что операции с потоком кэшированы? Есть ли встроенный кеш для потоков в
Java8
? - иногда
findAny
возвращает другое значение, но потраченное время почти равна последующих запусках не нравится первый запуск
смотри ниже
First run taken 84099 micro seconds 50000 findAny
Subseq run taken 163 micro seconds 25000 findAny
Subseq run taken 46 micro seconds 50000 findAny
Subseq run taken 52 micro seconds 25000 findAny
Я запустил тот же код с интервалом в 10 секунд, а последующие прогоны заняли 300-400 микросекунд. – Saravana
@Saravana заметила, что вы добираетесь до точки, где использование нескольких потоков более накладных, чем полезно. Я бы попробовал тот же тест без parallel() для сравнения. –
@Saravana BTW вам нужно вызвать ту же строку кода, а не код, который является его копией. Он не оптимизирует весь код, который выглядит одинаково, он фактически должен быть одной и той же строкой. Я предлагаю использовать цикл, в котором вы игнорируете результаты для первых 20000 итераций и печатаете результаты только после. –