Будет ли использование более одной map () занимать больше времени, чем объединение всей логики в одну map () при использовании Stream? - PullRequest
0 голосов
/ 26 апреля 2018

Вот два метода. test1() и test2()

public class MoreStreams {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Brad", "Kate", "Kim", "Jack",
                "Joe", "Mike", "Susan", "George", "Robert", "Julia", "Parker", "Benson");
        test1(names);
        //test2(names);
    }

    private static void test1(List<String> names) {
        List<String> result = names.stream()
                .map(name -> sub(toUpper(toLower(name))))
                .collect(Collectors.toList());
        System.out.println(result);
    }

    private static void test2(List<String> names) {
        List<String> result = names.stream()
                .map(MoreStreams::toLower)
                .map(MoreStreams::toUpper)
                .map(MoreStreams::sub)
                .collect(Collectors.toList());
        System.out.println(result);
    }

    private static String toUpper(String name) {
        System.out.println("to Upper: " + name);
        return name.toUpperCase();
    }

    private static String toLower(String name) {
        System.out.println("to Lower: " + name);
        return name.toLowerCase();
    }

    private static String sub(String name) {
        System.out.println("to Title: " + name);
        return name.substring(1);
    }
}

Первый использует несколько map(), а второй объединяет всю логику в один map(), принимают ли ониили нет одновременно и почему?А что, если в цепочке больше map() с?Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 26 апреля 2018

Если это будет вызываться так мало раз, что jit-компилятор не будет иметь времени для встраивания и оптимизации, теоретически мультикарта будет более дорогой из-за дополнительных вызовов стековых фреймов / методов.

ОднакоВаш основной способ измерения потребует миллионов вызовов, которые будут скомпилировать и встроить эти микро методы.Они вполне могут оказаться равными по производительности.

Вот куча аргументов JVM, чтобы показать больше того, что происходит во время вашего теста.Я позволю вам искать в сети то, что они делают.

-verbose:gc
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:"./gc.log"
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1M
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintCompilation
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
-XX:+UnlockDiagnosticVMOptions  -XX:+LogCompilation -XX:+PrintInlining

Последнее трио optins генерирует файл журнала, который можно использовать с "JitWatch", программой графического интерфейса, анализирующей и просматривающей все эти вещи и рассказывающей вам оJit события более дружественным образом.

Вы должны разработать свой тест без печати, конечно.Кроме того, и это ОЧЕНЬ важно, вы должны возвращать значение для каждого теста, иначе JIT обнаружит, что вы его не используете, и пропустите весь ваш код!Микробенчмаркинг теперь наука!См. Как написать правильный микро-тест на Java?

...