首页 > 解决方案 > 为什么函数式样式搜索在 Java 中执行得更快,然后是命令式

问题描述

我试图弄清楚,为什么编译器使用函数式样式快速浏览集合然后是命令式的。这是一个简单的示例,其中函数式搜索首先进行并需要 9.5 秒来处理它,而命令式紧随其后的是 10.3。一旦我重新排列它们,并将命令式放在功能之前,结果就会变得相似:10.1 和 10.29


我根据用户的反应添加了一些更改,这使我的代码更正确。现在基准测试在正确的时间开始并计算我真正需要的时间。但问题仍未得到解答。即使我运行两个独立的计时器,对于每个循环,功能循环完成它的搜索速度都比命令式要快得多。1.03 对 0.3。

import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
    List<Integer> numbers = new ArrayList();
    int size = 200000000;
    //add objects to collection
       for(int i = 0; i <= size; i++)
       {
       numbers.add(i);
       }
    //functional
    long timer = System.nanoTime();
       if(numbers.contains(size))
       {
       System.out.println(System.nanoTime() - timer) / 1000000000.0);
       }
    //imperative
    timer = System.nanoTime();
       for(Integer num : numbers)
       {
          if(num.equals(size))
          {
        System.out.println(System.nanoTime() - timer) / 1000000000.0);
          break;
          }
       }
    }
}

所以,问题是:

感谢您的回复

标签: javasearchfunctional-programmingbenchmarkingimperative-programming

解决方案


注意你在哪里开始和停止你的计时器。在您的代码示例中,您在填充列表之前获取开始时间。此外,您计算的时间差对我来说毫无意义。第二个将是程序的整个运行时间,而不仅仅是迭代循环的持续时间。

像这样再试一次:

import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
    List<Integer> numbers = new ArrayList<>();

    int size = 200000000;
    //add objects to collection
       for(int i = 0; i <= size; i++)
       {
       numbers.add(i);
       }
    //functional
       long timer = System.nanoTime(); //take start time here
       if(numbers.contains(size))
       {
       System.out.println(System.nanoTime() - timer) / 1000000000.0);
       }
    //imperative
       long timer = System.nanoTime(); //take a new start time for the second test
       for(Integer num : numbers)
       {
          if(num.equals(size))
          {
        System.out.println(System.nanoTime() - timer) / 1000000000.0);
          break;
          }
       }
    }
}

推荐阅读