C#,for-i和foreach哪个更加快?

作者:V君 发布于:2015-4-26 15:49 Sunday 分类:挖坑经验

TL;DR: 不要纠结, 哪个顺手就用哪个, 编译器比你更懂优化.


听我慢慢扯:

今天看到T同学在用AS3写有关循环的玩意, 这个问题就被引了出来.

然后我和L同学打了一架, 最后遗憾的断言失败.

我们都应该知道.net的集合有枚举器(IEnumerator)这玩意.

foreach遍历的集合应该实现这个接口. foreach取出枚举器实例不断调用next来取得当前对象,从而实现循环.

然而for-i是直接取索引器下标. 那时我断言了for-i比foreach更快. 

不服就上代码跑过. 于是就写几个不同的用例来测试.

首先是数组的for-i和foreach, 结果让我震惊, for-i居然比foreach慢一点点!

然后IList的遍历就是预期的for-i比较快了.

为毛? 经过许多调查,反编译,看汇编,上堆栈. 嗯,就如TL;DR说的一样, C#译器基本上一直在骗我们 ...

针对数组的foreach,去掉优化的反编译代码居然是局部变量index++的形式,这和说好的枚举器next不一样.

看了foreach和for-i的汇编, 发现for-i的汇编居然有压栈操作 然而foreach没有!

不纠结了, 总之怎么顺手怎么用吧...

标签: 软件开发 C# 循环效率

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap