日期:2014-05-18  浏览次数:20746 次

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优化了??
------解决方案--------------------
很好很不错 习惯重要
------解决方案--------------------