关于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()方法是其它的一个取数计算,比如数据库里取等等这些会考虑这方面影响。
关于for循环条件性能问题的更多相关文章
- python 循环语句的else语句用法,当循环条件变为假,切不是通过breakbreak终止的时候,就会执行这个else语句。
循环语句可以有一个else子句:当(for)循环迭代完整个列表或(while)循环条件变为假,而非由break语句终止时,就会执行这个else语句.下面循环搜索质数的代码例示了这一点: >> ...
- Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定
Angular4.x 创建组件|绑定数据|绑定属性|数据循环|条件判断|事件|表单处理|双向数据绑定 创建 angular 组件 https://github.com/angular/angular- ...
- 《python基础教程(第二版)》学习笔记 语句/循环/条件(第5章)
<python基础教程(第二版)>学习笔记 语句/循环/条件(第5章) print 'AB', 123 ==> AB 123 # 插入了一个空格print 'AB', 'CD' == ...
- [剑指offer] 29. 顺时针打印矩阵 (for循环条件)
思路: 先定义左上和右下角点坐标,打印可分为从左到右,从上到下,从右到左,从下到上.依次判断最后一圈的四个循环条件. #include "../stdafx.h" #include ...
- for循环实战性能优化之使用Map集合优化
笔者在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环 ...
- JS流程控制语句 重复重复(for循环)语句结构: for(初始化变量;循环条件;循环迭代) { 循环语句 }
重复重复(for循环) 很多事情不只是做一次,要重复做.如打印10份试卷,每次打印一份,重复这个动作,直到打印完成.这些事情,我们使用循环语句来完成,循环语句,就是重复执行一段代码. for语句结构: ...
- 41和为S的连续正数序列+注意循环条件记一下这题特殊解法
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...
- Python之循环条件、变量、字符串格式化
一.认识python python语言的优缺点,自行百度,这里不概述,简单说下,python是一门面向对象,解释型计算机语言.那么问题来了,解释型和编译型语言有什么区别? 1.解释型和编译型语言区别 ...
- JS数组循环的性能和效率分析(for、while、forEach、map、for of)
从最简单的for循环说起 for( 初始化:条件; ){} 条件为Trusy 值时候,可以继续执行for 循环,当条件变为Falsy 时跳出for循环.for循环常见的四种写法const person ...
随机推荐
- Entity Framework 学习初级篇--EntityClient(转)
摘自:http://www.cnblogs.com/xray2005/archive/2009/05/13/1456374.html System.Data.EntityClient 命名空间是 实体 ...
- 关于Android 构建
在简书上面有系列关于Android 的文章,还不错,部分同学可以在开发过程中阅读和学习:www.jianshu.com/collection/3fde3b545a35 关于Android 构建,看到这 ...
- 关于Android构建
“IDE都是给小白程序员的,大牛级别的程序员一定是命令行控,终端控,你看大牛都是使用vim,emacs 就一切搞定” 这话说的虽然有些绝对,但是也不无道理,做开发这行要想效率高,自动化还真是缺少不了命 ...
- weblogic启动报错
重启了一次linux服务器后,weblogic启动莫名报错,查看日志发现说部署的项目有个bean类无法加载, 1.然后手动删除 已经部署的项目,先在 domais/servers/AdminServe ...
- VNC的安装与配置
一,安装tigervnc-server VNC软件包 [root@localhost ~]# yum install tigervnc-server 设置开机自启动 [root@localhost ~ ...
- xutils使用过程
1,导入xutils的jar包 2,添加xutils需要使用的权限 <uses-permission android:name="android.permission.INTERNET ...
- mysql 命令行快速导出数据,导入数据
如果数据有20几万以上的时候,下面的方法很实用 导出数据 1.into outfile select * from table into outfile 'C:/a.sql'; 2.mysqldump ...
- 别人要访问我的电脑上部署的tomcat,必须关闭防火墙吗?
局域网内要访问服务器上部署的tomcat,必须关闭防火墙吗? 不一定. 如果是需要使用 IP:端口号(ip:port)来访问,可以做以下设置(这里仅是说的tomcat访问). 首先在服务器的控制面板中 ...
- Jq_Ajax 操作函数跟JQuery 遍历函数跟JQuery数据操作函数
JQuery文档操作方法 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 ...
- Python核心编程-基础2
open() 和 file() 函数会同时存在, 完成相同的功能.一般说来, 我们建议使用 open() 来读写文件, 在您想说明您在处理文件对象时使用 file() , 例如 if instance ...