Jok*_*ker 0 java java-8 java-stream
据我所知,流比传统的旧编程更快。
但是,当我运行以下代码时,结果出乎我的意料。
public class Application {
public static void main(String[] args) {
long startTime = System.nanoTime();
int[] a = { 1, 2, 3, 4 };
int m = Arrays.stream(a).reduce(Integer.MIN_VALUE, Math::max);
long endTime = System.nanoTime();
long totalTime = endTime - startTime;
System.out.println(totalTime);
}
}
Run Code Online (Sandbox Code Playgroud)
输出为:22857304
public class Application {
public static void main(String[] args) {
long startTime = System.nanoTime();
int[] a = { 1, 2, 3, 4 };
int e = a.length;
int m = Integer.MIN_VALUE;
for (int i = 0; i < e; i++)
if (a[i] > m)
m = a[i];
long endTime = System.nanoTime();
long totalTime = endTime - startTime;
System.out.println(totalTime);
}
}
Run Code Online (Sandbox Code Playgroud)
输出为:1459
请帮助我理解为什么流这么慢?
完全解释这一点需要很多时间;但是你在这里测试的是“冷”启动,基本上没有太多JIT,一个简单的循环不会像 Stream 解决方案那样分配对象 - 因此时间少了很多。Streams 有一个基础设施可以运行——这需要一段时间来“加热”以提高性能。
代码的那些部分也不等效,就像您正在使用的那样Math::max,在另一部分是普通的>。您可以反复测试此代码并查看结果,但即便如此,您也应该使用为微基准测试量身定制的工具,我知道JMH(并且Caliper来自谷歌 - 但我只相信第一个)。
随着江铃控股,你可以在所有测试这些方法没有JIT,C1或C2仅有的编译器,或者一些其他的设置,对于一些调校的例子看到这个答案
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |