Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java dto中实体转换的快速方法_Java_Foreach_Java 8_Java Stream - Fatal编程技术网

Java dto中实体转换的快速方法

Java dto中实体转换的快速方法,java,foreach,java-8,java-stream,Java,Foreach,Java 8,Java Stream,哪一个更快?在foreach中添加到列表,或在流中映射和收集 //Solution 1 List<Card> cards = mobileUserService.getCurrentUser().getUserCard(); final List<CardDTO> dtos = new ArrayList<>(cards.size()); cards.forEach(card -> dtos.add(cardTransformer.transform

哪一个更快?在
foreach
中添加到列表,或在
流中映射和收集

//Solution 1
List<Card> cards = mobileUserService.getCurrentUser().getUserCard();

final List<CardDTO> dtos = new ArrayList<>(cards.size());

cards.forEach(card -> dtos.add(cardTransformer.transform(card)));
结果变量1:

   List<Card> cards = new ArrayList<>();
       for (int i = 0; i < count; i++) {
        Card c = Card.createFakeCard();
        cards.add(c);
    }


    long startTime1 = System.nanoTime();
    //Solution 1
    final List<CardDTO> dtos = new ArrayList<>(cards.size());
    cards.forEach(card -> dtos.add(cardTransformer.transform(card)));
    long endTime1 = System.nanoTime();


    long startTime2 = System.nanoTime();
    //Solution 2
    List<CardDTO> dtos2 = cards.stream()
            .map(cardTransformer::transform)
            .collect(Collectors.toList());

    long endTime2 = System.nanoTime();


    double runtime1 = (endTime1 - startTime1) / Math.pow(10, 6);
    double runtime2 = (endTime2 - startTime2) / Math.pow(10, 6);
    log.error("Number of elements: " + count + "\n" +
            "Solution 1 " +
            "Total time (ms): " + runtime1 + "\n" +
            "Solution 2 " +
            "Total time (ms): " + runtime2);
Number of elements: 1
Solution 1 Total time (ms): 3.862259
Solution 2 Total time (ms): 8.919641
Number of elements: 1
Solution 1 Total time (ms): 0.012556
Solution 2 Total time (ms): 0.032712
Number of elements: 1
Solution 1 Total time (ms): 0.011565
Solution 2 Total time (ms): 0.034363
Number of elements: 2
Solution 1 Total time (ms): 0.01619
Solution 2 Total time (ms): 0.03965
Number of elements: 10
Solution 1 Total time (ms): 0.020486
Solution 2 Total time (ms): 0.044607
Number of elements: 100
Solution 1 Total time (ms): 0.395842
Solution 2 Total time (ms): 0.729233
Number of elements: 1000
Solution 1 Total time (ms): 0.276229
Solution 2 Total time (ms): 0.37866
Number of elements: 5000
Solution 1 Total time (ms): 0.987951
Solution 2 Total time (ms): 1.092693
Number of elements: 10000
Solution 1 Total time (ms): 2.701169
Solution 2 Total time (ms): 3.287001
Number of elements: 20000
Solution 1 Total time (ms): 11.095115
Solution 2 Total time (ms): 11.3046
Number of elements: 50000
Solution 1 Total time (ms): 4.339383
Solution 2 Total time (ms): 6.235984
Number of elements: 100000
Solution 1 Total time (ms): 8.312332
Solution 2 Total time (ms): 9.088485
测试代码变体2:

   List<Card> cards = new ArrayList<>();
       for (int i = 0; i < count; i++) {
        Card c = Card.createFakeCard();
        cards.add(c);
    }



    long startTime2 = System.nanoTime();
    //Solution 2
    List<CardDTO> dtos2 = cards.stream()
            .map(cardTransformer::transform)
            .collect(Collectors.toList());

    long endTime2 = System.nanoTime();


    long startTime1 = System.nanoTime();
    //Solution 1
    final List<CardDTO> dtos = new ArrayList<>(cards.size());
    cards.forEach(card -> dtos.add(cardTransformer.transform(card)));
    long endTime1 = System.nanoTime();

    double runtime1 = (endTime1 - startTime1) / Math.pow(10, 6);
    double runtime2 = (endTime2 - startTime2) / Math.pow(10, 6);
    log.error("Number of elements: " + count + "\n" +
            "Solution 1 " +
            "Total time (ms): " + runtime1 + "\n" +
            "Solution 2 " +
            "Total time (ms): " + runtime2);
Number of elements: 1
Solution 1 Total time (ms): 1.672247
Solution 2 Total time (ms): 9.868603
Number of elements: 1
Solution 1 Total time (ms): 0.005617
Solution 2 Total time (ms): 0.043946
Number of elements: 1
Solution 1 Total time (ms): 0.005618
Solution 2 Total time (ms): 0.040971
Number of elements: 2
Solution 1 Total time (ms): 0.006278
Solution 2 Total time (ms): 0.041963
Number of elements: 10
Solution 1 Total time (ms): 0.011564
Solution 2 Total time (ms): 0.045929
Number of elements: 100
Solution 1 Total time (ms): 0.065093
Solution 2 Total time (ms): 0.121263
Number of elements: 1000
Solution 1 Total time (ms): 0.65555
Solution 2 Total time (ms): 0.968456
Number of elements: 5000
Solution 1 Total time (ms): 0.779127
Solution 2 Total time (ms): 1.244686
Number of elements: 10000
Solution 1 Total time (ms): 2.03769
Solution 2 Total time (ms): 2.337048
Number of elements: 20000
Solution 1 Total time (ms): 6.12232
Solution 2 Total time (ms): 6.038063
Number of elements: 50000
Solution 1 Total time (ms): 6.12232
Solution 2 Total time (ms): 8.463334
Number of elements: 100000
Solution 1 Total time (ms): 16.468047
Solution 2 Total time (ms): 17.86109

我不是JVM如何处理lambda的专家,但几个月前我自己做了一些研究,所以。。。 我认为关键是流中“lambda”的数量

每次编写lambda时,都会发生两件主要事情:

  • 在编译时,lambda将被提取为宿主类的私有方法。使用
    javap
  • 在运行时,JVM将创建一个对象来调用该私有方法。(这里有很多乐趣,但为了简单起见)

  • 然后在代码中,第一种情况只有1个lambda,而第二种情况有2个lambda。因此,在某个时刻,JVM必须为第二种情况连接、创建和实例化一个对象,2次。这就是您的第一个代码“更快”的原因。

    您的基准测试说明了什么?为了更具声明性,您可以将
    map(card->cardTransformer.transform(card))
    替换为
    map(cardTransformer::transform)
    您认为有显著的区别吗?如果是这样,为什么?基准测试问题的可能重复之处在于它们总是给出答案,但答案并不一定意味着什么。像这样的基准测试(运行几次并使用
    nanoTime()
    )进行测量)通常毫无价值。但底线是,不要再担心微观性能问题(这些都是),而是应用所有这些大脑周期来编写清晰、可维护的代码。你会从投资中得到更好的回报。
    Number of elements: 1
    Solution 1 Total time (ms): 1.672247
    Solution 2 Total time (ms): 9.868603
    Number of elements: 1
    Solution 1 Total time (ms): 0.005617
    Solution 2 Total time (ms): 0.043946
    Number of elements: 1
    Solution 1 Total time (ms): 0.005618
    Solution 2 Total time (ms): 0.040971
    Number of elements: 2
    Solution 1 Total time (ms): 0.006278
    Solution 2 Total time (ms): 0.041963
    Number of elements: 10
    Solution 1 Total time (ms): 0.011564
    Solution 2 Total time (ms): 0.045929
    Number of elements: 100
    Solution 1 Total time (ms): 0.065093
    Solution 2 Total time (ms): 0.121263
    Number of elements: 1000
    Solution 1 Total time (ms): 0.65555
    Solution 2 Total time (ms): 0.968456
    Number of elements: 5000
    Solution 1 Total time (ms): 0.779127
    Solution 2 Total time (ms): 1.244686
    Number of elements: 10000
    Solution 1 Total time (ms): 2.03769
    Solution 2 Total time (ms): 2.337048
    Number of elements: 20000
    Solution 1 Total time (ms): 6.12232
    Solution 2 Total time (ms): 6.038063
    Number of elements: 50000
    Solution 1 Total time (ms): 6.12232
    Solution 2 Total time (ms): 8.463334
    Number of elements: 100000
    Solution 1 Total time (ms): 16.468047
    Solution 2 Total time (ms): 17.86109