您的位置:首页 > 其它

由浅入深CIL系列:6.For和Foreach的CIL结构组成以及运行效率

2011-07-07 12:22 531 查看
本节即将新接触的CIL操作符如下:

br.s IL_003c 无条件地将控制转移到目标指令(短格式)

clt 从计算堆栈的顶部弹出当前值并将其存储到索引 2 处的局部变量列表中

ldloca.s CS$5$0001 将位于特定索引处的局部变量的地址加载到计算堆栈上(短格式)

leave.s 退出受保护的代码区域,无条件将控制转移到目标指令(缩写形式)
constrained. 约束要对其进行虚方法调用的类型

endfinally 将控制从异常块的 fault 或 finally 子句转移回公共语言结构 (CLI) 异常处理程序

在C#中我们经常会遇到遍历数组、遍历List<>、遍历HashTable等情况,在本文中我们首先构造一个List<int>对象,然后通过For和Foreach来遍历它看看他们之间的CIL代码有什么区别和不同。

首先我们贴出C#代码如下:

class Program
{
static void Main(string[] args)
{
//初始化一个List<int>
List<int> listInt = new List<int>();
for (int i = 0; i < 100000; i++)
{
listInt.Add(i + 1);
}
Console.WriteLine("--------------------------");
//第一种for遍历
for (int i = 0; i < listInt.Count; i++)
{
}

//第二种foreach遍历
foreach (int i in listInt)
{
}

}
}


其次我们来看CIL代码如下所示,因为CIL代码有点儿长,设置为隐藏有需要的可以点击查看:

时间耗时测算代码

class Program
{
static void Main(string[] args)
{
//初始化一个List<int>
List<int> listInt = new List<int>();
for (int i = 0; i < 1000000; i++)
{
listInt.Add(i + 1);
}
Console.WriteLine("--------------------------");
//第一种for遍历
Stopwatch sw1 = new Stopwatch();
sw1.Start();
for (int i = 0; i < listInt.Count; i++)
{
}
sw1.Stop();
Stopwatch sw2 = new Stopwatch();
sw2.Start();
//第二种foreach遍历
foreach (int i in listInt)
{
}
sw2.Stop();
Console.WriteLine("当前得List<int>对象数目:"+listInt.Count.ToString());
Console.WriteLine(@"for     的遍历消耗时间是:" + sw1.Elapsed);
Console.WriteLine(@"foreach 的遍历消耗时间是:" + sw2.Elapsed);
Console.ReadLine();
}
}


首先List<int> listInt为100的耗时如下三图:







其次List<int> listInt为10000的耗时如下三图:







最后我们看看List<int> listInt为10000的耗时如下三图:







结语:通过本篇文章的CIL我们知道了for和foreach在.NET环境的中间语言中是如何控制和循环的,另外也更加深入的了解for和foreach的区别。最后对于效率的比较可能和环境等有比较大的差异,大家可以不放可以自己建立一个控制台程序试试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: