zoukankan      html  css  js  c++  java
  • 论 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友好的这-边,因此它自然能够赢得这个测试,并没有神马奇怪。当然还有其他很多原因。

  • 相关阅读:
    tcpdump使用技巧
    linux: 系统调用
    linux命令:rsync, 同步文件和文件夹的命令
    编译kernel:make Image uImage与zImage的区别
    linux下操作gpio寄存器的方法
    Linux输入子系统(Input Subsystem)
    Android电源管理基础知识整理
    【Android休眠】之Android休眠机制
    拓扑排序入门(真的很简单)
    有向无环图的拓扑排序
  • 原文地址:https://www.cnblogs.com/jiaohuadehulike/p/14295025.html
Copyright © 2011-2022 走看看