常用数组效率比较


测试平台:

奔腾1.6G 双核CPU
1G内存
vs2008 调试环境测试。


一、ArrayList (100W,1W)
Stopwatchtimer=newStopwatch();
timer.Start();

System.Collections.ArrayListal
=newSystem.Collections.ArrayList();

for(inti=0;i<1000000;i++)
{
al.Add(i);
}

timer.Stop();

Console.Write(timer.ElapsedMilliseconds.ToString()
+"\t");

Stopwatchtimer1
=newStopwatch();
timer1.Start();

for(inti=0;i<10000;i++)
{
al.Contains(i);
}

timer1.Stop();

Console.WriteLine(timer1.ElapsedMilliseconds.ToString());

98775
160891
107773
193769


二、Hashtable (100W,1W)

Stopwatchtimer=newStopwatch();
timer.Start();

System.Collections.Hashtableht
=newSystem.Collections.Hashtable();

for(inti=0;i<1000000;i++)
{
ht.Add(i,i);
}

timer.Stop();

Console.Write(timer.ElapsedMilliseconds.ToString()
+"\t");

Stopwatchtimer1
=newStopwatch();
timer1.Start();

for(inti=0;i<10000;i++)
{
ht.ContainsKey(i);
}

timer1.Stop();

Console.WriteLine(timer1.ElapsedMilliseconds.ToString());
}

3750
6730
5400
4950

把timer1提高到100万(Hashtable (100W,100W))

389139
616277
516140
610277

三、HashSet (100W,100W)

Stopwatchtimer=newStopwatch();
timer.Start();

System.Collections.Generic.HashSet
<int>ht=newSystem.Collections.Generic.HashSet<int>();

for(inti=0;i<1000000;i++)
{
ht.Add(i);
}

timer.Stop();

Console.Write(timer.ElapsedMilliseconds.ToString()
+"\t");

Stopwatchtimer1
=newStopwatch();
timer1.Start();

for(inti=0;i<1000000;i++)
{
ht.Contains(i);
}

timer1.Stop();

Console.WriteLine(timer1.ElapsedMilliseconds.ToString());



8932
7932
7932
11731

四、List (100W,1W)

Stopwatchtimer=newStopwatch();
timer.Start();

System.Collections.Generic.List
<int>ht=newSystem.Collections.Generic.List<int>();

for(inti=0;i<1000000;i++)
{
ht.Add(i);
}

timer.Stop();

Console.Write(timer.ElapsedMilliseconds.ToString()
+"\t");

Stopwatchtimer1
=newStopwatch();
timer1.Start();

for(inti=0;i<10000;i++)
{
ht.Contains(i);
}

timer1.Stop();

Console.WriteLine(timer1.ElapsedMilliseconds.ToString());


16379
19392
18403
18392

把List<int>换成List<object>

96945
1571033
106909
193910

换成string,i.ToString()

4961238
5311190
5721246
5361258

五、Dictionary (100W,100W)

Stopwatchtimer=newStopwatch();
timer.Start();

System.Collections.Generic.Dictionary
<int,int>ht=newSystem.Collections.Generic.Dictionary<int,int>();

for(inti=0;i<1000000;i++)
{
ht.Add(i,i);
}

timer.Stop();

Console.Write(timer.ElapsedMilliseconds.ToString()
+"\t");

Stopwatchtimer1
=newStopwatch();
timer1.Start();

for(inti=0;i<1000000;i++)
{
ht.ContainsKey(i);
}

timer1.Stop();

Console.WriteLine(timer1.ElapsedMilliseconds.ToString());

11335
12534
12434
12634


六、Dictionary Linq查询(100W,100W)

用个Linq试试
Stopwatchtimer=newStopwatch();
timer.Start();

System.Collections.Generic.Dictionary
<int,int>ht=newSystem.Collections.Generic.Dictionary<int,int>();

for(inti=0;i<1000000;i++)
{
ht.Add(i,i);
}

timer.Stop();

Console.Write(timer.ElapsedMilliseconds.ToString()
+"\t");

Stopwatchtimer1
=newStopwatch();
timer1.Start();

for(inti=0;i<1000000;i++)
{
ht.Where(c
=>c.Key==i);
}

timer1.Stop();

Console.WriteLine(timer1.ElapsedMilliseconds.ToString());


112177
10778
12570
10782

结论:
1、如果是使用缓存的话,那么3.5带来的单泛型集合的HashSet可以替代List了。虽然载入速度慢一点,但是查询速度要比List泛型快很多。要注意到,上述测试List的查询时万级的,而HashSet是百万级

2、Dictionary泛型可以替换掉Hashtable了,虽然如果在字符或者object类型下可能会没这么明显。但是在数字类型的匹配上,Dictionary比Hashtable大概快了2倍,而这个开销估计是Hashtable的装箱造成的。

3、Linq还是要慢一些
优质内容筛选与推荐>>
1、QT编译之错--”Basic XLib functionality test failed!”
2、Oracle资源管理器(二)-- 创建和使用数据库资源计划
3、用多点构造polyline问题
4、微软职位内部推荐-Senior Development Engineer
5、[面试]笔试面试常见问题-之一


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn