zoukankan      html  css  js  c++  java
  • for语句嵌套循坏性能的剖析

    日常工作中,处理数据难免会遇到遍历,for循环可能是我们用的比较多的了。本节就来探讨下for语句嵌套循环的性能,猜想下面两个语句的性能。

    语句1

    for ( i= 0;  i < 1000000;  i++)
    {
    for (j =0; j < 100; j++) { expression; }
    }

    语句2

    for ( i= 0;  i < 100;  i++)
    {
    for (j =0; j < 1000000; j++) { expression; }
    }

    乍一看,感觉两个嵌套循环执行的次数都是一样的,那么他们的时间复杂度是一样的吗?让我们来分析下,语句1外层循环执行了1000000次,内层循环执行了1000000*100次,而语句2外层循环执行了100次,内层循环也执行了1000000*100次。那么,既然内层执行的次数都一样,外层是不是执行的越少越好呢?让我们写代码认证下。

    验证代码

            static void Main(string[] args)
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                for (int i = 0; i < 1000000; i++)
                {
                    for (int j = 0; j < 100; j++)
                    {
                        // expression;
                    }
                }
                sw.Stop();
                Console.WriteLine(sw.ElapsedMilliseconds);
    
                sw.Reset();
    
                sw.Start();
                for (int i = 0; i < 100; i++)
                {
                    for (int j = 0; j < 1000000; j++)
                    {
                        // expression;
                    }
                }
                sw.Stop();
                Console.WriteLine(sw.ElapsedMilliseconds);
            }

    验证截图

    得出结论,对于for语句的嵌套循环,总循环次数相等,外层循环越小越好。个人拙见,工作中具体情况具体对待...

    补充总结(2月3日)

    上文的描述给大家展现的都是现象,并没有告诉大家事物的本质。(@Sunday*)Sunday*告诉我说“是因为减少了对int j=0的赋值操作,这些会有一定的性能上的消耗,但这种优化不是本质上的性能提升!”,于是引发了我更深层次的思考。其实,控制外层循环次数越小,我们可以发现i自增的次数少了,i<100的判断次数少了,以及内层循环中的int j=0赋值的次数也少了,自然而然性能就得到了提升

    Sunday*说的很对:使用for应尽量避免里面创建对象,减少循环次数,这样才能达到优化;而我得出的结论:对于for语句的嵌套循环,总循环次数相等,外层循环越小越好。两者都是正确的。代码是死的,人是活的,人得灵活驾驭代码,具体情况具体对待。

    最后,我不否认这种优化对性能提升不了多少,但是,假如我遇到了本文所提的情况,我必须得本能得写出最优代码,这也是我研究的目的所在。

  • 相关阅读:
    【zz】编程修养(一二三)
    Lec1计算字符串的相似度
    ASP.NETFLV处理流代码
    获取指定文件夹下所有子目录及文件(树形)
    Flex及AS3的百条常用知识(转载)
    [AS3] 解决跨域问题
    Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
    ASP.NET中的File类和Directory类的相关知识
    Asp.net 备份、还原Ms SQLServer及压缩Access数据库
    http://blog.csdn.net/octverve/archive/2008/01/29/2071356.aspx
  • 原文地址:https://www.cnblogs.com/jackbase/p/4268335.html
Copyright © 2011-2022 走看看