java - 为什么函数式样式搜索在 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;
}
}
}
}
所以,问题是:
- 为什么功能搜索完成得更快?
感谢您的回复
解决方案
注意你在哪里开始和停止你的计时器。在您的代码示例中,您在填充列表之前获取开始时间。此外,您计算的时间差对我来说毫无意义。第二个将是程序的整个运行时间,而不仅仅是迭代循环的持续时间。
像这样再试一次:
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;
}
}
}
}
推荐阅读
- f# - 如何在 F# 中使用 FSharp.Data.GraphQL 对 GraphQL 服务器进行错误处理?
- c++ - 发送(smtp)和接收(pop3)邮件的目标代码需要为任何操作系统执行
- unity3d - 物体移动时粘在地板上
- css - 如果输入有 pseudo="-internal-input-suggested" 的样式
- excel - 如何在 Google 电子表格中进行类似于 Excel 表格自动填充的 Arrayformula 计算?
- keras - “我想知道在哪里可以下载原始数据,用于YOLO官方页面上的模型训练”
- drupal-8 - 如何在drupal8中实现邮政编码和城市的依赖下拉菜单?
- java - 存在 JNI API 调用时的 JUnit 测试覆盖率
- python - 在 Django 中保存多对多字段的实例
- python - 将 DataFrame.from_records 添加到现有的 df