java8 collections_Java 8:Streams vs Collections的性能

博主作为Java 8新手,进行了一个小的非正式基准测试,比较新Streams API与旧Collections的性能。测试是过滤整数列表,为偶数计算平方根并存储结果。给出了代码和双核机器的结果,还提出测试公平性、流与集合速度比较及方法选择等问题。

我是Java 8的新手。我仍然不深入了解API,但我已经做了一个小的非正式基准测试来比较新Streams API与优秀旧Collections的性能。

测试包括过滤一个列表Integer,并为每个偶数计算平方根并将其存储在结果List中Double。

这是代码:

public static void main(String[] args) {

//Calculating square root of even numbers from 1 to N

int min = 1;

int max = 1000000;

List sourceList = new ArrayList<>();

for (int i = min; i < max; i++) {

sourceList.add(i);

}

List result = new LinkedList<>();

//Collections approach

long t0 = System.nanoTime();

long elapsed = 0;

for (Integer i : sourceList) {

if(i % 2 == 0){

result.add(Math.sqrt(i));

}

}

elapsed = System.nanoTime() - t0;

System.out.printf("Collections: Elapsed time:\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));

//Stream approach

Stream stream = sourceList.stream();

t0 = System.nanoTime();

result = stream.filter(i -> i%2 == 0).map(i -> Math.sqrt(i)).collect(Collectors.toList());

elapsed = System.nanoTime() - t0;

System.out.printf("Streams: Elapsed time:\t\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));

//Parallel stream approach

stream = sourceList.stream().parallel();

t0 = System.nanoTime();

result = stream.filter(i -> i%2 == 0).map(i -> Math.sqrt(i)).collect(Collectors.toList());

elapsed = System.nanoTime() - t0;

System.out.printf("Parallel streams: Elapsed time:\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));

}.

以下是双核机器的结果:

Collections: Elapsed time:        94338247 ns   (0,094338 seconds)

Streams: Elapsed time:           201112924 ns   (0,201113 seconds)

Parallel streams: Elapsed time:  357243629 ns   (0,357244 seconds)

对于这个特定的测试,流的速度大约是集合的两倍,并行性没有帮助(或者我使用错误的方式?)。

问题:

这个测试公平吗?我犯了什么错吗?

流比收集慢吗?有谁在这方面做了一个很好的正式基准?

我应该采取哪种方法?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值