论 IntStream 和 for 循环的速度

论 IntStream 和 for 循环的速度

用 IntStream 和 for 循环来实现计算 [0, 10000] 之间偶数和。

import java.util.stream.IntStream;

public class TestFour {
	public static void main(String[] args) {
		long count1 = 0;
		for(int i = 0;i <= 10000;i++)  
			if(i % 2 == 0)
				count1 += i;
		System.out.println(count1);
		
		long count2 = IntStream.rangeClosed(0, 10000).filter(a -> a % 2 == 0).sum();
		System.out.println(count2);
		
	}

}
/* Code Running Results
 * 25005000
 * 25005000
 */

运行出来结果都是 25005000
我们先看 for-循环

for(int i = 0;i <= 10000;i++)  
	if(i % 2 == 0)
		count1 += i;

for-循环需要三行代码实现,在 for 循环里面使用 if 判断语句来筛选偶数再累加到一块。

再看 IntStream

long count2 = IntStream.rangeClosed(0, 10000).filter(a -> a % 2 == 0).sum();

而 IntStream 只需要一行就可以实现,更简短更美观,用起来很舒服,让人感觉很爽。
IntStream流不是一种数据结构,不保存数据,它只是在原数据集上定义了一组操作
在 IntStream 中使用 rangeClosed() 选取 [0, 10000] 的整数,( 如果使用range() 选取的范围是 [0, 10000) ) 用过滤器 filter() 筛选出偶数,再用求和方法 sum() 即可得出结果。
但是 IntStream 却使代码变慢了数十倍,甚至百倍,如下测试一下他们所用的时间:

import java.util.stream.IntStream;

public class TestFour {
	public static void main(String[] args) {
		long start1 = System.currentTimeMillis();
		long count1 = 0;
		for(int i = 0;i <= 10000;i++)  
			if(i % 2 == 0)
				count1 += i;
		long end1 = System.currentTimeMillis();
		System.out.println(count1 + "  " + (end1-start1) + "毫秒");
		
		long start2 = System.currentTimeMillis();
		long count2 = IntStream.rangeClosed(0, 10000).filter(a -> a % 2 == 0).sum();
		long end2 = System.currentTimeMillis();
		System.out.println(count2 + "  " + (end2-start2) + "毫秒");
		
	}

}
/* Code Running Results
 * 25005000  1毫秒
 * 25005000  158毫秒
 */

很明显 IntStream 比 for 循环慢了多得多
当然每次运行结果都不同,不同设备跑出来结果都不相同,但不管怎么测试 IntStream 都是比 for-循环快多的多。
至于什么原因呢?测试的性能主要取决于内存访问与遍历。其中内存访问这个还受限制于硬件本身,所以不同的平台上会有不同的结果。

使用流会在主框架内进行调用,不可避免地增加内存调用。而一个IT编译器本身是有一个上限的,虽然大部分情况下是用不满的。因此,我们将这种情况分为IT友好与不友好,而 for- 循环本身是处于IT友好的这-边,因此它自然能够赢得这个测试,并没有神马奇怪。当然还有其他很多原因。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值