zoukankan      html  css  js  c++  java
  • for循环执行效率

    1.情况1

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define  A 10000
    #define  B 10
    #define  num 100000
    
    void main(){
    	double a[A][B];
    	double b=0;
    
    	int t1=clock();
    	for (int n=0;n<num;n++)
    	{
    		for (int i=0;i<A;i++)
    		{
    			for (int j=0;j<B;j++)
    			{
    				b=1;
    			}
    		}
    	}
    
    	int t2=clock();
    
    	for (int m=0;m<num;m++)
    	{
    		for (int ii=0;ii<B;ii++)
    		{
    			for (int jj=0;jj<A;jj++)
    			{
    				b=1;
    			}
    		}
    	}
    	int t3=clock();
    
    	printf("%d %d 
    ",t2-t1,t3-t2);
    }

    第一种情况是内外层循环次数相差比较大,这种情况次数少的应该放外循环,循环次数多的应该放内循环。这是因为如果外循环比较大,则内存地址跳跃性比较大,cache命中率比较低,所以会慢点,不过也不是绝对的,可是概率上可能会慢。

    2.情况2

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define  A 10000
    #define  B 10
    #define  num 10000
    
    void main(){
    	double a[A][B];
    	double b=0;
    
    	int t1=clock();
    	for (int n=0;n<num;n++)
    	{
    		for (int i=0;i<A;i++)
    		{
    			for (int j=0;j<B;j++)
    			{
    				a[i][j]=1;
    			}
    		}
    	}
    
    	int t2=clock();
    
    	for (int m=0;m<num;m++)
    	{
    		for (int ii=0;ii<B;ii++)
    		{
    			for (int jj=0;jj<A;jj++)
    			{
    				a[jj][ii]=1;
    			}
    		}
    	}
    	int t3=clock();
    
    	printf("%d %d 
    ",t2-t1,t3-t2);
    }
    第二种情况影响循环效率的主要是访问数组的速度,由于二维数组在内存中是先存放行,然后再存放列。所以在访问数组时,如果先访问行再访问列,则访问地址是连续的,会比较快。但是如果先访问列再访问行,则每次访问数组中元素时,地址跳跃都比较大,cache命中率比较低,在物理内存不足情况下将会分布存储数据,这样每访问一次数组会在不会页面中跳转,内存页面调度和页面交换次数往往会增加,这会大大降低访问速度。

  • 相关阅读:
    Java下的tinylog日志打印
    rmi的调用
    linux下hex转ascii
    CSP攻略
    ThinkPHP5代码执行的简单分析
    MySQL UDF(User Defined Function)提权
    与邮件协议相关的端口
    常见哈希算法的密文格式
    ThinkPHP 5.0.x 反序列化漏洞 PoC
    Tomcat AJP协议文件包含漏洞(CVE-2020-1938)
  • 原文地址:https://www.cnblogs.com/whzhaochao/p/5023478.html
Copyright © 2011-2022 走看看