【问题标题】:Will using more than one map () take more time than aggregating all logic in a single map () while using Stream?在使用 Stream 时,使用多个 map () 会比在单个 map () 中聚合所有逻辑花费更多时间吗?
【发布时间】:2018-04-26 01:10:44
【问题描述】:

这里有两种方法。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()s 怎么办?请帮帮我。

【问题讨论】:

  • 高性能是一个严重的问题吗?如果没有,请关注可读性。
  • 你测试了吗?

标签: java functional-programming java-stream


【解决方案1】:

如果调用次数如此之少,以至于 jit 编译器没有时间进行内联和优化,那么由于额外的堆栈帧/方法调用,multimap 理论上会更昂贵。

但是,您测量的主要方法将需要数百万次调用,这些调用将 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

最后三个 optin 正在生成一个可使用“JitWatch”的日志文件,这是一个解析和浏览所有内容并以更友好的方式告诉您有关 jit 事件的 gui 程序。

您当然应该在没有 println 的情况下设计您的测试。 此外,这非常重要,您应该为每个测试返回一个值,否则 JIT 会认为您不使用它并跳过所有代码! 微基准测试现在是一门科学! 见How do I write a correct micro-benchmark in Java?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    相关资源
    最近更新 更多