java 8流执行与传统循环性能

时间:2017-01-07 05:43:33

标签: performance java-8 java-stream

我要求从属性文件读取数据,该文件是命令分隔的,显然是字符串形式。所以在那之后我将它分成字符串数组。

我要求将该字符串数组转换为整数列表。

我尝试了两种方法:

  1. 传统的每个循环都有铸造,
  2. 使用java 8 stream。
  3. 然后我想我必须根据表现计算一个好的时间。所以我有一些粗略的数据。

    代码:

    public class PropertyLoadCSV {
        private static Properties properties;
        public static void main(String[] args) {
            try {
                properties = new Properties();
                properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("resources/csvfile.properties"));
    
                String ids = properties.getProperty("ids");
                String[] splitedIDs = ids.split(",");
    
                long startTime = System.nanoTime();
                convertUsingJava7(splitedIDs);
                long endTime = System.nanoTime();
                long duration = (endTime - startTime);
                System.out.println(duration);
    
                long startTime1 = System.nanoTime();
                convertUsingJava8(splitedIDs);
                long endTime1 = System.nanoTime();
                long duration1 = (endTime1 - startTime1);
                System.out.println(duration1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        static List<Integer> convertUsingJava7(String[] splited){
            List<Integer> list = new ArrayList<>();
            for(String s: splited){
                list.add(Integer.valueOf(s));
            }
            return list;
        }
        static List<Integer> convertUsingJava8(String[] splited){
            return Stream.of(splited).map(Integer::parseInt).collect(Collectors.toList());
        }
    }
    

    在控制台中得到了一些意想不到的结果:

      

    131601

         

    254094088

    所以真的java 8流转换并慢慢转换然后传统方式?

    我必须将哪一个用作效果关注?

    Here's工作示例。

1 个答案:

答案 0 :(得分:4)

你正在测量这里的冷启动,这是一个单一的方法调用,没有给JIT任何机会为你做好事。

由于invokedynamic引导,lambda表达式的第一次调用总是很慢(它必须创建实例,实际方法将被调用,但这只是一个惩罚,你必须只支付一次)。

使用像 jmh 这样的工具来正确测量结果,无论哪种方式,你的标准代码都会比溪流更快,这是正常的,你必须为流的基础设施付出代价创建