• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gw2010
重新编程
博客园    首页    新随笔    联系   管理    订阅  订阅
关于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()方法是其它的一个取数计算,比如数据库里取等等这些会考虑这方面影响。

 

 

 

 

 

声明本博客文章未特殊注明均为原创,转载请注明作者和原地址。 博客地址:http://www.cnblogs.com/gw2010/ 博客首发:http://www.zhou2019.cn
posted on 2013-11-28 12:17  gw2010  阅读(1372)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3