for的效率测试和结果,分享一下

游北亮
博客专家认证
2012-07-06 04:22:30
加精
之前一直认为
for (int i = 0, h = arr.Count; i < h; i++)

for (int i = 0; i < arr.Count; i++)
两种写法,在C#里应该是差不多的,今天突然有人问,就写了个程序测试了一下,结果出乎我的意料
如果arr是List<T>,前者的效率比后者高大约一倍,如果arr是string[],两者效率基本差不多

测试代码:
int tnum = 100000; // 添加或查找的次数
int outnum = 10; // 外层循环次数

List<string> arr = new List<string>();
for(int i=0;i<tnum;i++)
arr.Add(i.ToString());
string[] arr2 = new string[tnum];

for(int j=0;j<outnum;j++)
{
Stopwatch watch = new Stopwatch();
string msg;

msg = "Number ";
watch.Reset();
watch.Start();
for (int i = 0, h = arr.Count; i < h; i++)
{
}
watch.Stop();
Console.WriteLine(msg + "耗时:" + watch.ElapsedTicks.ToString());

msg = ".Count ";
watch.Reset();
watch.Start();
for (int i = 0; i < arr.Count; i++)
{
}
watch.Stop();
Console.WriteLine(msg + "耗时:" + watch.ElapsedTicks.ToString());

msg = "Length ";
watch.Reset();
watch.Start();
for (int i = 0; i < arr2.Length; i++)
{
}
watch.Stop();
Console.WriteLine(msg + "耗时:" + watch.ElapsedTicks.ToString());
}
...全文
7249 218 打赏 收藏 转发到动态 举报
写回复
用AI写文章
218 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolll028 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

Count 那种费时,是因为每次访问arr.Count都要去取出这个arr.Count,汇编要进行好几次的交换,而且number那种,取出count后放到h中,以后直接比较h立即数即可
[/Quote]


这就是道理啊,楼主只是说了表面。 其实string[]也是一样的道理,每次比较时都去算了一次。

用常量就只用去查找内存里的值。
q2192944 2012-08-07
  • 打赏
  • 举报
回复
好贴 学习了
gzc145 2012-07-30
  • 打赏
  • 举报
回复
如果是在java里面呢?
qinwentuo 2012-07-23
  • 打赏
  • 举报
回复
受教了,也谢谢楼上的精彩讨论
b8820230 2012-07-23
  • 打赏
  • 举报
回复
good
我就是大神 2012-07-20
  • 打赏
  • 举报
回复
都是牛人啊
阿双2009 2012-07-18
  • 打赏
  • 举报
回复
看来得改改习惯了~~
powerzone 2012-07-17
  • 打赏
  • 举报
回复
学习了,平时在编码时真没有留意到这些细节,不过一说出来就释然了,其实主要都是习惯的问题,就是平时不习惯去思考最优办法
gfliu 2012-07-17
  • 打赏
  • 举报
回复
牛啊,学习了
modev 2012-07-17
  • 打赏
  • 举报
回复
很好,值得学习。。。
Amateur0 2012-07-17
  • 打赏
  • 举报
回复
xu学习了
xb12369 2012-07-17
  • 打赏
  • 举报
回复
难道程序优化
aegisho 2012-07-16
  • 打赏
  • 举报
回复
做性能测试的时候,请选择release,ctrl+f5。
这种性能上的差距,完全可以忽略不计。
性能差距不大的时候,选择可读性比较高的写法,而不是所谓的高性能写法。
老鱼趣多多 2012-07-16
  • 打赏
  • 举报
回复
精彩,收藏。!
小枪 2012-07-16
  • 打赏
  • 举报
回复
循环次数大了我一般不用for
luckings 2012-07-16
  • 打赏
  • 举报
回复
良好的编码习惯很重要!!!!!
游北亮 2012-07-16
  • 打赏
  • 举报
回复
谢谢支持,但是你忘记了,值类型是不可能为null的
可为null的又不是值类型了


[Quote=引用 183 楼 的回复:]
引用 1 楼 的回复:

发这个帖的意思是,要养成良好的代码习惯,
当然,这个不是影响代码性能的重点,只是平时写代码时,顺手就写上效率较高的代码,会更好。

类似的提升效率的地方,还有拼接字符串时,值类型一定要加上ToString()
比如用:string a = "aa" + 123.ToString();
而不是用string a = "aa" + 123


那我问你,如……
[/Quote]
程老师2088 2012-07-16
  • 打赏
  • 举报
回复
受用了,以后坚决不省这么一句话了。。。
bkhmjgtc 2012-07-16
  • 打赏
  • 举报
回复
用着怎么样?
cnwin 2012-07-15
  • 打赏
  • 举报
回复
嗯,debug方式出的结果的确是count方式慢些,即使string[](楼主的代码没有写for (int i = 0, h = arr2.Length; i < h; i++)),也是循环每次求循环终值效率低些。这点我们可以想象得到,是因为每次都求一下所至。然而release方式的话也就没这差别了。对于这个循环问题,我们可以不必非得照理论上良好的写法去写了。只是这点是由于做了release测试所以我们可以放心了。但别处有关影响性能的写法我们还是当拿捏得当的。
加载更多回复(152)

110,557

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧