2016-10-17 1 views
1

Я побежал ниже пример кода в моем компьютере работает с 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 

мы могли видеть время, затрачиваемое разницу между первыми и последующими запусками.

  1. Это означает, что операции с потоком кэшированы? Есть ли встроенный кеш для потоков в Java8?
  2. иногда 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 

ответ

1

означает операции потока кэшируются?

Нет, код, созданный для реализации lambdas, и загруженные классы кэшируются.

Есть ли встроенный кэш для потоков в Java8?

Нет специального кеша для потоков.

иногда findAny возвращает другое значение, но потраченное время почти равна последующих запусках не нравится первый запуск

Действительно. Кэширование ничего не происходит. В первый раз вы платите штраф за загрузку кода.

BTW кодирование на самом деле не оптимизировано до тех пор, пока оно не будет запущено не менее 10 000 раз. Я бы повторил этот тест несколько раз за 10 секунд, прежде чем синхронизировать его.

+0

Я запустил тот же код с интервалом в 10 секунд, а последующие прогоны заняли 300-400 микросекунд. – Saravana

+0

@Saravana заметила, что вы добираетесь до точки, где использование нескольких потоков более накладных, чем полезно. Я бы попробовал тот же тест без parallel() для сравнения. –

+0

@Saravana BTW вам нужно вызвать ту же строку кода, а не код, который является его копией. Он не оптимизирует весь код, который выглядит одинаково, он фактически должен быть одной и той же строкой. Я предлагаю использовать цикл, в котором вы игнорируете результаты для первых 20000 итераций и печатаете результаты только после. –