gpt4 book ai didi

具有无限系列的 Java Stream-API 性能

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:37 26 4
gpt4 key购买 nike

我正在观察 Java8 和新的 Stream-API 的一些特殊行为。

我希望以下两个语句的性能相同,但事实并非如此。

LongStream.iterate(1, n -> n + 1).limit(5000)
.anyMatch(n -> isPerfectCube((n*n*n)+((n*n)*p)));

对比

LongStream.iterate(1, n -> n + 1)
.anyMatch(n -> isPerfectCube((n*n*n)+((n*n)*p)));

这两个语句都应返回 true,而且我预计不会有任何性能差异,因为它们可以在找到的第一个匹配项上都短路。语句中的唯一区别在于,一个语句受限于要迭代的数字范围的上限,而另一个则没有。

有人可以向我解释为什么一个比另一个运行得更快并且使用更少的内存吗?

最佳答案

有一些值p其中 n 的大值条件为真.例如 p = 3 , n = 50_331_648 的条件变为真.在这种情况下,5000 的限制当然会在性能方面胜出,但两种计算不会返回相同的结果。

我随机挑选了一个 p (3002) 为 n 返回真小于 5000 并且结果非常接近(尽管带有 limit 的版本稍微慢一些,可能是因为额外的条件 n < 5000 )。

基准测试结果(每次调用 anyMatch 以微秒为单位):

Benchmark                    Mode   Samples         Mean   Mean error    Units
c.a.p.SO24003674.limit avgt 5 130.165 2.663 us/op
c.a.p.SO24003674.noLimit avgt 5 126.876 2.440 us/op

基准代码(使用jmh):

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
@Warmup(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@Fork(1)
public class SO24003674 {

private int p = 3002;

@GenerateMicroBenchmark
public boolean limit() {
return LongStream.iterate(1, n -> n + 1).limit(5000)
.anyMatch(n -> isPerfectCube((n * n * n) + ((n * n) * p)));
}

@GenerateMicroBenchmark
public boolean noLimit() {
return LongStream.iterate(1, n -> n + 1)
.anyMatch(n -> isPerfectCube((n * n * n) + ((n * n) * p)));
}

private static boolean isPerfectCube(long n) {
long tst = (long) (Math.cbrt(n) + 0.5);
return tst * tst * tst == n;
}
}

关于具有无限系列的 Java Stream-API 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com