首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2012-07-29 
for的效率测试和结果,分享一下之前一直认为for (int i 0, h arr.Count i h i++)和for (int i 0

for的效率测试和结果,分享一下
之前一直认为
for (int i = 0, h = arr.Count; i < h; i++)

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

测试代码:

C# code
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());}


[解决办法]
牛,学习了!谢谢LZ!
[解决办法]


要养成良好的编码习惯
[解决办法]
这很正常啊、
即使arr是string[]、也会差很多的
一般for中的第二个条件一般都是2个变量、
我很少用不是变量的数存进去
[解决办法]
我都是用第二种的多,以后得改了
[解决办法]


要养成良好的编码习惯
[解决办法]
好吧,,学习了。。。
[解决办法]
Count 那种费时,是因为每次访问arr.Count都要去取出这个arr.Count,汇编要进行好几次的交换,而且number那种,取出count后放到h中,以后直接比较h立即数即可
[解决办法]
对list来说这两种写法使用的场合不同,前者不允许删减list,后者可以。
[解决办法]
不错啊学了
[解决办法]
lz很细心,探究精神值得学习。
[解决办法]
学习,,,

[解决办法]
个人觉得单独提取出来h=arr.length比较好 不然代码怎么看怎么不舒服~
主要时间还是浪费在每次循环都需要调用get方法吧
[解决办法]
探讨

最近也有这样感觉,有时不能为了少写代码却消耗CPU资源,所以,写好程序后多看几遍,优化是有必要的。
如原来为了省事,复制就算了:
if (指定.IndexOf(转换.Substring(字符, 1)) >= 0) 等效 += 指定.Substring(指定.IndexOf(转换.Substring(字符, 1)), 1);
显然上面这样写是消耗的写法,是不尽合理的,应该优化如下:
int……

[解决办法]
有帮助,学习了
[解决办法]
不同写法,确认有不同的效率
[解决办法]
代码写的有层次,比较好
[解决办法]
Release版本,启动调试和开始执行(不调试)的结果不同,在后一种情况下,三种写法的计数相近,差别消失
最终还是被JIT优化了??
[解决办法]
很好很不错 习惯重要
------解决方案--------------------


很好,
[解决办法]

好帖!
[解决办法]
楼主的意思是测试要避免引入字符串处理,以免影响结果
[解决办法]
好习惯受用终生
[解决办法]
受教了
[解决办法]
细心~~
[解决办法]
学习了,养成好习惯!
[解决办法]
确实,学习了,以前都是不管三七二十一能实现功能就好了,没想到还有这么大差距,楼主牛人!学习了!
[解决办法]
按SP老大的说法,这种循环几十W次然后得出性能结论的做法都是蛋疼的
[解决办法]

探讨

看了一下il代码,
for (int i = 0, h = arr.Count; i < h; i++)
C# code
IL_0054: ldc.i4.0
IL_0055: stloc.s V_8
IL_0057: ldloc.2
IL_0058: callvirt instance int32 class [mscorlib]System.Collec……

[解决办法]
支持楼上说的,还是要用变量,不然时间消耗在变量引用查找上了
[解决办法]
有知道怎么赚取积分的吗

[解决办法]
探讨

按SP老大的说法,这种循环几十W次然后得出性能结论的做法都是蛋疼的

[解决办法]
实测无任何差别。
static void Main(string[] args)
{
List<int> li = new List<int>(1000000);
for (int i = 0; i < li.Capacity; i++)
{
li.Add(i);
}
DateTime d1 = DateTime.Now;
//for (int i = 0; i < li.Count; i++)
//{
// li[i] = li[i] * 100;
//}
for (int i = 0, h = li.Count; i < h; i++)
{
li[i] = li[i] * 100;
}
DateTime d2 = DateTime.Now;
Console.WriteLine(d2-d1);
Console.Read();
}
[解决办法]
探讨

对list来说这两种写法使用的场合不同,前者不允许删减list,后者可以。

[解决办法]
好贴,订一下
[解决办法]

[解决办法]
这两种实际上是没有区别的。
因为count函数会被优化成直接访问内存。
而cpu有cache,最终这种访问内存的操作都会变成访问cache。
所以无论是哪一种,实际上是没有多少差别的。
[解决办法]
探讨
Release版本,启动调试和开始执行(不调试)的结果不同,在后一种情况下,三种写法的计数相近,差别消失
最终还是被JIT优化了??

[解决办法]
我一般用第二种
[解决办法]
谢谢LZ,关注细节,受教。
我写的时候一般都是
int i,arr.count=N;
for(i=0;i<arr.count;i++)
今天学习了
[解决办法]
Clr via C# 里面已经有结论了啊,数组两个没太多区别,因为后者会优化为前者
至于泛型则不优化,前者肯定优于后者..

热点排行