关于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 ...
随机推荐
- [SAP ABAP开发技术总结]消息处理Messages
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 线程入门之start()和run()的区别
package com.thread; /** * start()和run()的区别 * start():并行执行 * run():方法调用,顺序执行 * @author 95Yang */ publ ...
- Xcode error: conflicting types for 'XXXX'
问题描述:在main方法中调用了一个写在main方法后面的方法,比如: void main(){ A(); } void A(){} Xcode编译后就报错:conflicting types for ...
- SQL Povit
),) ,,@logistics_code='All',@fee_type='All' ),) ,@strDateList='',@from_date=cast((ltrim(@yr)+'-'+ltr ...
- iOS - MVC 架构模式
1.MVC 从字面意思来理解,MVC 即 Modal View Controller(模型 视图 控制器),是 Xerox PARC 在 20 世纪 80 年代为编程语言 Smalltalk-80 发 ...
- MyEclipse manage Deployment 管理器失效
如果你使用的是10.7版本,可参考本文 出错: 1.Deployments 部署按钮失效; 2.MyEclipse 启动后初始化WorkSpaces抛出Deployment的空指针异常(java.la ...
- vi_命令
1.文件末尾新增一行: 非编辑模式下,按大写的G 跳到最后一行. 然后按小写的O键,增加一行. 2.删掉一行: 非编辑状态下,光标定位到要删除的那一行,然后 dd 3.删字符 在非插入模式下,把光标 ...
- python 将页面保存为word
将博客或者留言页面保存为word文档 -----------2016-5-11 14:40:04-- source:http://blog.csdn.net/how8586/article/detai ...
- js optiontransferselect
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- Hibernate的集合映射与sort、order-by属性
[Hibernate]Hibernate的集合映射与sort.order-by属性 常用集合Set.List.Map,相信大家都很熟悉,面试中也会经常问.Set和List都继承了Collection接 ...