关于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 ...
随机推荐
- 浏览器被hao.360.cn劫持怎么办
特么的现在互联网太没节操了,一大早发现我的浏览器被hao.360.cn劫持了,弄了好久都没弄好,后来一想可能是因为qvod的原因,这可是哥当年看片的神器啊…… 废话不说: 1,进入:C:\Progra ...
- [C和指针]第五部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Codeforces723E One-Way Reform【欧拉回路】
题意:给你n点m边的图,然后让你确定每条边的方向,使得入度=出度的点最多 . 度数为偶数的点均能满足入度 = 出度. 证明:度数为奇数的点有偶数个,奇度点两两配对连无向边,则新图存在欧拉回路,则可使新 ...
- poj1066Treasure Hunt(线段相交)
链接 很纠结的找到了所有线段的中点,又很纠结的找到了哪些中点可以直接相连,最后bfs一下求出了最短路.. #include <iostream> #include<cstdio> ...
- 抓取oschina上面的代码分享python块区下的 标题和对应URL
# -*- coding=utf-8 -*- import requests,re from lxml import etree import sys reload(sys) sys.setdefau ...
- android学习---- WindowManager 接口 (
The interface that apps use to talk to the window manager. 这个接口用于与 window manager (窗口管理器, 应用框架层) 进行交 ...
- jquery定位
1.$("div").offset().left ; div到文档的左距离(offset() 方法返回或设置匹配元素相对于文档的偏移) $("div").off ...
- Maven clean时候出现异常
首先我使用IDEA创建一个空的project,在这个空的project中创建了一个maven module,然后将这个module打包之后,使用maven clean这个target 的时候报错,如下 ...
- K均值聚类(Kmeans)
Sigma = [1, 0; 0, 1]; mu1 = [1, -1]; x1 = mvnrnd(mu1, Sigma, 200); mu2 = [5.5, -4.5]; x2 = mvnrnd(mu ...
- easyui combobox 智能提示搜索
<!-- 获取机会点名称列表 --><script> function initOpportunityNameFuzzyQuery() { $('#jihuidianmingc ...