zoukankan      html  css  js  c++  java
  • 关于for循环条件性能问题

    昨天看一博客写到一条 尽量使用 for(int i=0,ct=list.Count();i<ct;i++){} 这样的格式,因为我平时一般都是用for(int i=0;i<list.Count();i++){}

    按正常的for循环的逻辑,后面一情况是会多次调用list.Count()方法的,我就想验证编译器是否把list.Count()放入一个昨时变量,实现同第一种方式一

    样性能的情况。

    1。第一步我是先用时间测试,大概代码如下

                System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                for (int i = 0; i < li.Count(); i++)
                {
                    ;
                }
                sw.Stop();
                Console.WriteLine(sw.Elapsed);
    
                System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();
                sw1.Start();
                for (int i = 0,ct=li.Count(); i < ct; i++)
                {
                    ;
                }
                sw1.Stop();
                Console.WriteLine(sw1.Elapsed);
    

    //不会用这个写,怎么出一两个了,经常格式调一好。

    上面两代是可以测试时间,如果li里的数量很大就可以看出差别了,我取了100,1000个来测试,测试多次,都是第一个时间用得更多,第二个时间用得更少,因为常测试sql代码,觉得C#没有清理缓存,计划之类的东西,所以把两段代码换了一下位置看看是否结果一样,我去,还是第一段代码用时更长,也就是上面两种格式里的第二种用时长了,当时觉得一阵坑。

    决定查看一下IL代码看看两段生成的IL代码是否一样,IL是不太好阅读,所以我加了一些标示来确实开如结束,就是用的Console.WriteLine("-------"),这样在IL代码里可以看到,方便查找

    读这段IL比较重要的部分是,如下

    IL_0009:  br.s       IL_0019
    
    //中间有一部分
    
    IL_0020:  brtrue.s   IL_000b
    

     主要是br.s和brtrue.s就可以确定了循环了,这两个后面有标识,就是跳转到哪一行执行,下面一个是如果为真就跳转。确定了循环,就可以看出Count()方法是多次调用还一次调用,这下确定了的确是第二种方式更好,因为只调用了一次Count()方法。于是做了下面的实验就能看到效果了。

    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                for (int i = 0; i < li.Count(); i++)
                {
                    ;
                }
                sw.Stop();
                Console.WriteLine(sw.Elapsed);
    
                //
    
                System.Diagnostics.Stopwatch sw3 = new System.Diagnostics.Stopwatch();
                sw3.Start();
                for (int i = 0; i < li.Count(); i++)
                {
                    ;
                }
                sw3.Stop();
                Console.WriteLine(sw3.Elapsed);
    
                //
    
    
                System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();
                sw1.Start();
                for (int i = 0,ct=li.Count(); i < ct; i++)
                {
                    ;
                }
                sw1.Stop();
                Console.WriteLine(sw1.Elapsed);
    

     不看第一段代码,因为可能因为是第一次调用,加载等因素有时间上的差别,但是第二段和第三段可以任意交换都可以测试出时间,可以得出只计长一次Count()方法的性能会好一点。

    当然这个在很大的循环时才能看出差别,一般是看不出差别的。但是如果像Count()方法是其它的一个取数计算,比如数据库里取等等这些会考虑这方面影响。

  • 相关阅读:
    JS判断浏览器
    【JS】时间不足10位补0方案
    【js学习小计】
    【Tangram】 通过监听进行事件触发
    JavaScript CSS Style属性对照表
    Resolve and Remove "BAD PASSWORD: It is Based on a Dictionary Word "in Linux
    [C++]关键字explicit
    [转]CentOS设置程序开机自启动的方法
    SqlServerCLR聚合函数:分组连接字符串
    vmware centos 虚拟机复制
  • 原文地址:https://www.cnblogs.com/gw2010/p/3447425.html
Copyright © 2011-2022 走看看