zoukankan      html  css  js  c++  java
  • 提高代码的运行效率(2) 四

    【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

    2、 在编写的代码的时候,我们强调需要对循环首先进行循环内部的计算,然后进行循环外面的计算。在此,我们可以进行下面一个测试:

    void loop_analyse()
    {
        int m = GetTickCount();
        int inner = 0;
        int outer = 0;
        for(outer = 0; outer < 1000; outer ++)
        {
            for (inner = 0; inner < 1000; inner ++)
            { 
                a[outer][inner] = inner;
            }

        }  
      
        printf("%d\n", GetTickCount() - m);

        m = 0;
        for(inner = 0; inner < 1000; inner ++)
        {
            for (outer = 0; outer < 1000; outer ++)
            {
                data[outer][inner] = inner;
            }

        }
        printf("%d\n", GetTickCount() - m);
    }

        我们在VC6.0上面的测试结果是31、64。原因就是我们的数据在内存中间是按照先内存,然后再按照外层的顺序排列的。如果在计算的时候,我们首先使用了内部的数据,那么在cpu cache命中率上就会很高。相反,如果按照outer进行数据的遍历的话,那么就需要进行数据的不停跳转,在cpu cache上面也需要不停地进行刷新。在一旦cpu的cache命中率下降,就会重新将数据从内存加载到cpu的cache上面。等到循环得到一定的积累之后,就会在时间的运算上面发生很大的变化。两者之间的运行效率差异就会变得非常明显。

    3、尽可能在循环的时候只运行本层的数据,我们可以做下面一个测试用例。

    int data1[10000000] = {0,1};
    int data2[10000000] = {0,1};

    void loop_layer_test()
    {
         int m = GetTickCount();
         int outer = 0;
         int inner = 0;
         for(outer = 0; outer < 10000000; outer ++)
         {
              data1[outer] = outer;
              data2[outer] = outer;
         }
         printf("%d\n", GetTickCount() - m);

         m = GetTickCount();;
         for(inner = 0; inner < 10000000; inner ++)
         {
             data1[inner] = inner;
         }

         for(outer = 0; outer < 10000000; outer ++)
         {
              data2[outer] = outer;
         }
         printf("%d\n", GetTickCount() - m);
    }

        在我的VC6.0测试的时候,两者的运行差别时间还是挺大的,有兴趣的朋友可以在自己的机器上面好好试一下,看看是不是效果显著。其实道理和上面的准则是差不多的,只不过我们这一次涉及的单层循环的东西,不过在本质上还是差别不是很大。

  • 相关阅读:
    java项目配置域名(tomcat直接配置 or 使用nginx反向代理)
    java爬虫学习
    python爬虫
    log4j的日志级别(ssm中log4j的配置)
    Python中list,tuple,dict,set的区别和用法
    [转]C# Eval在asp.net中的用法及作用
    【转】一个运维经理的运维经验总结
    [转]使用 LVS 实现负载均衡原理及安装配置详解
    [转]33个网站足以使你成为一个天才
    搜狐邮箱想说爱你不容易!
  • 原文地址:https://www.cnblogs.com/sier/p/5676475.html
Copyright © 2011-2022 走看看