Java流的工作速度比for循环慢
我被告知Java流是处理大量数据的好选择,我最近做了一个比较测试。但是,测试结果出乎意料: 问题来自CodeWar: 假设有一个100人的地铁,在每一站都有几个人上车,几个人下车。我们的目标是统计大量停靠后留在地铁的人数(100000) 这是我的密码:Java流的工作速度比for循环慢,java,algorithm,java-stream,Java,Algorithm,Java Stream,我被告知Java流是处理大量数据的好选择,我最近做了一个比较测试。但是,测试结果出乎意料: 问题来自CodeWar: 假设有一个100人的地铁,在每一站都有几个人上车,几个人下车。我们的目标是统计大量停靠后留在地铁的人数(100000) 这是我的密码: import java.util.ArrayList; public class Metro1 { private final static int STOPS = 100000; private static ArrayLis
import java.util.ArrayList;
public class Metro1 {
private final static int STOPS = 100000;
private static ArrayList<int[]> metro = new ArrayList<int[]>();
public static int sum1() {
int sum = 0;
for(int[] x: metro) {
sum +=x[0] - x[1];
}
return sum;
}
public static int sum2() {
return metro.stream()
.mapToInt(x -> x[0]-x[1])
.sum();
}
public static void main(String[] args) {
long start=0;
long end = 0;
metro.add(new int[] {100,0});
for(int i=1;i<STOPS;i++) {
int in = (int) Math.round(Math.random() * 10);
int out = (int) Math.round(Math.random() * 10);
metro.add(new int[] {in,out});
}
System.out.println("Stops: " + metro.size());
start = System.currentTimeMillis();
System.out.println("sum1: " + sum1());
end = System.currentTimeMillis();
System.out.println("sum1 (for loop): " + String.valueOf(end-start) + " milliseconds.");
start = System.currentTimeMillis();
System.out.println("sum2: " + sum2());
end = System.currentTimeMillis();
System.out.println("sum1 (stream): " + String.valueOf(end-start) + " milliseconds.");
}
}
我认为代码足够简单,但是为什么流比for循环慢呢
谢谢
Alex就像
regexes
一样,特定的自产解析器可以更快,流也可以提供快速简洁的数据处理方法。流的优点之一是在处理元素时可以最小化中间数据结构。另一个是注释中已经提到的并行方面
但是关于你的例子
- 仅仅依靠使用内部时钟的性能测试(即使我也这样做)并不是准确评估性能的最佳方法。使用类似的方法进行测试
- 至于您的结果,请尝试以下方法:
- 将
更改为停止
100\u 000\u 000
- 将您的流修改为
返回metro.stream().parallel() .mapToInt(x->x[0]-x[1]) .sum()代码>
- 将
Windows四核i7笔记本电脑上的结果
Stops: 100000000
sum1: -7073
sum1 (for loop): 908 milliseconds.
sum2: -7073
sum1 (stream): 518 milliseconds.
流式API更注重代码的可读性和可维护性。For循环可能提供更好的性能,但有时性能可能不是衡量的重要指标。拥有可维护的代码同样重要
我们可以对非常大的数据集使用并行流,但同样不能保证更好的性能,因为这涉及到其他开销,并且取决于可用资源 流速度比循环慢,这仅仅是因为它们做的工作更多。其优点主要是可读性(和并行化;但并行流的使用频率远远低于您所相信的围绕流的吹扫)。你有一个搜索引擎,不是吗?这能回答你的问题吗?谢谢然而,即使我使用parallel(),我也无法使流运行得更快,事实上,在发布此问题之前,我确实尝试过parallel。我的笔记本电脑是双核mac电脑。我仔细检查了我的代码,发现里面有一个bug。现在,使用parallel()的流运行得更快,与for循环几乎相同。再次感谢您提供的详细信息!
Stops: 100000000
sum1: -7073
sum1 (for loop): 908 milliseconds.
sum2: -7073
sum1 (stream): 518 milliseconds.