代码之家  ›  专栏  ›  技术社区  ›  Saber

在使用流时,使用多个map()会比在单个map()中聚合所有逻辑花费更多的时间吗?

  •  0
  • Saber  · 技术社区  · 6 年前

    这里有两种方法。 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() ,第二个将所有逻辑聚合到一个 地图() ,它们是否需要相同的时间,为什么? 如果还有更多呢 地图() 链中有什么?请帮帮我。

    1 回复  |  直到 6 年前
        1
  •  0
  •   user2023577    6 年前

    如果调用次数太少,jit编译器没有时间内联和优化,那么从理论上讲,由于额外的stackframes/方法调用,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
    

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

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