昨天看一博客写到一条 尽量使用 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()方法是其它的一个取数计算,比如数据库里取等等这些会考虑这方面影响。

关于for循环条件性能问题的更多相关文章

  1. python 循环语句的else语句用法,当循环条件变为假,切不是通过breakbreak终止的时候,就会执行这个else语句。

    循环语句可以有一个else子句:当(for)循环迭代完整个列表或(while)循环条件变为假,而非由break语句终止时,就会执行这个else语句.下面循环搜索质数的代码例示了这一点: >> ...

  2. Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定

    Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定 创建 angular 组件 https://github.com/angular/angular- ...

  3. 《python基础教程(第二版)》学习笔记 语句/循环/条件(第5章)

    <python基础教程(第二版)>学习笔记 语句/循环/条件(第5章) print 'AB', 123 ==> AB 123 # 插入了一个空格print 'AB', 'CD' == ...

  4. [剑指offer] 29. 顺时针打印矩阵 (for循环条件)

    思路: 先定义左上和右下角点坐标,打印可分为从左到右,从上到下,从右到左,从下到上.依次判断最后一圈的四个循环条件. #include "../stdafx.h" #include ...

  5. for循环实战性能优化之使用Map集合优化

           笔者在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环 ...

  6. JS流程控制语句 重复重复(for循环)语句结构: for(初始化变量;循环条件;循环迭代) { 循环语句 }

    重复重复(for循环) 很多事情不只是做一次,要重复做.如打印10份试卷,每次打印一份,重复这个动作,直到打印完成.这些事情,我们使用循环语句来完成,循环语句,就是重复执行一段代码. for语句结构: ...

  7. 41和为S的连续正数序列+注意循环条件记一下这题特殊解法

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  8. Python之循环条件、变量、字符串格式化

    一.认识python python语言的优缺点,自行百度,这里不概述,简单说下,python是一门面向对象,解释型计算机语言.那么问题来了,解释型和编译型语言有什么区别? 1.解释型和编译型语言区别 ...

  9. JS数组循环的性能和效率分析(for、while、forEach、map、for of)

    从最简单的for循环说起 for( 初始化:条件; ){} 条件为Trusy 值时候,可以继续执行for 循环,当条件变为Falsy 时跳出for循环.for循环常见的四种写法const person ...

随机推荐

  1. python_way day16 JQuary

    python_way day16 JQuery 封装dom js代码 jQuery(1.10,1.12-兼容性好,2.0.以后放弃了ie9以下) - 封装了Dom & JavaScript 查 ...

  2. android测试参考,及CreateProcess failure, error问题解决

    今天小伙伴问我问题,我给了这2个小命令,或许做android测试的同学可以用得着. 截图命令adb shell /system/bin/screencap -p /sdcard/screenshot. ...

  3. 简单的poi导出excel文件

    /**** 创建excel文件**/ 1 import java.io.FileOutputStream; import java.io.IOException; import java.util.C ...

  4. linux下文件系统类型的学习

    1. 以超级用户权限登陆Linux,进入  /lib/modules/2.6.32--504.el6.x86_64/kernel/fs目录执行 ls 命令(不同Linux发行版本的Fs目录有些不同你可 ...

  5. iOS - Swift NSDate 时间

    前言 NSDate public class NSDate : NSObject, NSCopying, NSSecureCoding NSDate 用来表示公历的 GMT 时间(格林威治时间).是独 ...

  6. yum安装指定版本软件包__20160308

    举例子: 安装 libGL-devel 1. yum list libGL-devel 居然说没有匹配的包的信息... [root@CentOS6 ~]# yum list libGL-devel L ...

  7. Google账户_GooglePlay_关联

    PS:这过程叫一个折腾...穷逼的无奈啊... 1. 1.1. 网上搜到说,安装 google play & google框架服务,手机需要root,没去证实这个事情... 用了之前的 And ...

  8. oracle 性能优化建议小结

    原则一:注意WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHER ...

  9. Javascript设计模式之创建构造函数和方法

    构造函数和方法 var Book = function (isbn,title,author) { this.setIsbn(isbn); this.setTitle(title); this.set ...

  10. tracert 命令详解

    tracert 命令详解 How to Use the TRACERT Utility The TRACERT diagnostic utility determines the route to a ...