Поток Java 8, получение max () занимает много времени только в первый раз - PullRequest
0 голосов
/ 10 марта 2019

У меня есть HashMap, который принимает Integer как Ключ и массив Integer как значение , HashMap<Integer, Integer[]>().

Так что я 'm пытался получить максимальные значения (размер массива) каждый раз, когда я зацикливался на другом массиве, например:

long startTime = System.currentTimeMillis();

result[i] = map.entrySet().stream().mapToInt(element -> element.getValue().size()).max().getAsInt() + 1;

long endTime   = System.currentTimeMillis();

long totalTime = endTime - startTime;

System.out.println( totalTime);

После того, как я запускаю эту программу несколько раз на разных входах, я всегда получаю высокую задержку в первый разНапример:

29 // <- First time
0
0
0
0
0

Использование циклов:

long startTime = System.currentTimeMillis();

for (Map.Entry<Integer, List<Integer>> element: map.entrySet()) {
     result[i] = result[i] < element.getValue().size() ? element.getValue().size() : result[i];
}


long endTime = System.currentTimeMillis();

long totalTime = endTime - startTime;

System.out.println( "  " + totalTime);

Вывод:

0
0
0
0
0
0

Конечно, это большая проблема на больших входах, так что здесь не так?

1 Ответ

3 голосов
/ 10 марта 2019

Это происходит потому, что JVM генерирует новый класс на лету, когда Lambda вызывается впервые.После этого этот класс можно использовать повторно.Вот почему у вас высокая задержка в первый раз.

Кроме того, важно понимать, что лямбды не всегда являются лучшими вариантами, особенно для простых операций, которые можно выполнить с помощью старого доброго цикла. Эта статья является богатой и довольно хорошим чтением для тех, кто интересуется производительностью Stream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...