首 页
|
新闻资讯
|
视频教程
|
电脑入门
|
程序开发
|
网页制作
|
操作系统
|
设计在线
|
办公软件
|
网络安全
|
常用软件
|
认证考试
深入了解foreach和for循环到底有哪些不同之处
看到有些博客谈到for 循环的性能要好于 foreach。那么到底是不是呢?如果是的话,究竟两者之间有什么区别? Jitted的代码可能是最直接的方式来了解两者的差异。 例子代码: [code]namespace Test { class Sample { private static int counter; public int Value = counter++; } class Program { static void Main(string[] args) { List
samples = new List
() { new Sample(), new Sample(), new Sample() }; ForeachTest(samples); ForTest(samples); Console.Read(); } private static void ForeachTest(List
samples) { foreach (Sample item in samples) { Console.WriteLine(item.Value); } } private static void ForTest(List
samples) { for (int i = 0; i < samples.Count; i++) { Console.WriteLine(samples[i].Value); } } } }[/code] [b]环境准备:[/b] 新建一个c#命令行工程,然后拷贝例子代码。 选择Release模式。 Ctrl+F5在VS环境直接运行程序但不进入调试模式。 打开windbg, F6来attach刚才运行起来的程序。 Windbg: .loadby sos mscorwks 加载sos 先来看一下 for 循环到底有什么。 0:000> !name2ee test Test.Program.ForTest Module: 00192c5c (Test.exe) Token: 0x06000004 MethodDesc: 00193014 Name: Test.Program.ForTest(System.Collections.Generic.List`1
) JITTED Code Address: 00a90208 反编译出ForTest的jitted代码,方便大家阅读我已经放入了较详细的注释。 0:000> !u 00a90208 Normal JIT generated code Test.Program.ForTest(System.Collections.Generic.List`1
) Begin 00a90208, size 4d >>> 00a90208 55 push ebp 004001f9 8bec mov ebp,esp 004001fb 57 push edi 004001fc 56 push esi 004001fd 53 push ebx 004001fe 8bd9 mov ebx,ecx //ecx 保存 samples 对象 00400200 33ff xor edi,edi //edi 清零 00400202 8b430c mov eax,dword ptr [ebx+0Ch] //设置List的大小到eax,就是3 00400205 85c0 test eax,eax 00400207 7e31 jle 0040023a //如果上句测试失败,跳转到结束 00400209 3bf8 cmp edi,eax //循环的开始。进行循环比较,edi是当前的相等于变量i的值,eax是3 0040020b 7205 jb 00400212 //如果已经超过范围,直接抛出OutOfRangeException,否则跳过下一句 *** WARNING: Unable to verify checksum for C:"Windows"assembly"NativeImages_v2.0.50727_32"mscorlib"9adb89fa22fd5b4ce433b5aca7fb1b07"mscorlib.ni.dll 0040020d e872a6bc66 call mscorlib_ni+0x68a884 (66fca884) (System.ThrowHelper.ThrowArgumentOutOfRangeException(), mdToken: 060000d9) 00400212 8b4304 mov eax,dword ptr [ebx+4] //传送List对象内部数组的地址到eax 00400215 3b7804 cmp edi,dword ptr [eax+4] //范围校验 00400218 7325 jae 0040023f //失败跳转到JIT_RngChkFail 0040021a 8b44b80c mov eax,dword ptr [eax+edi*4+0Ch] //传送第i个sample对象的地址到eax 0040021e 8b7004 mov esi,dword ptr [eax+4] //传送第i Sample个对象的Value值进入esi 00400221 e87ad07666 call mscorlib_ni+0x22d2a0 (66b6d2a0) (System.Console.get_Out(), mdToken: 06000772) 00400226 8bc8 mov ecx,eax //传送 Console.Out 地址到 ecx 00400228 8bd6 mov edx,esi //传送第i Sample个对象的Value值进入 edx 0040022a 8b01 mov eax,dword ptr [ecx] //传送Console.Out 的method table到 eax 0040022c ff90bc000000 call dword ptr [eax+0BCh] //打印Sample.Value到控制台程序 00400232 47 inc edi //edi加1 00400233 8b430c mov eax,dword ptr [ebx+0Ch] //设置List的大小到eax,就是3 00400236 3bc7 cmp eax,edi //检查是否需要继续循环 00400238 7fcf jg 00400209 //跳转到继续循环代码处如果上步为真 0040023a 5b<
阅读全文:http://x8.MaiCoo.com/tech/c/18251.html
发表时间:2008-8-21 8:58:43 讨论数:0
暂无讨论组成员发表!
昵 称
:麦客网友[游客] 如果您不想匿名评论请先
登录
或
注册
!
评 论
:请自觉遵守互联网相关政策法规,管理员有权删除恶意评论、广告和违禁词语。
验证码:
热门讨论文章
1170次
一步一步教你如何重装XP系统(超详细)
122次
Windows XP系统重装详细视频教程
58次
vb.net基础教程
49次
Visual Basic 6.0(VB)入门到精通视频教程
22次
ASP与数据库连接方法
21次
Photoshop精细磨皮去斑教程
20次
Photoshop制作“红心中国”QQ头像
19次
Windows操作系统太慢 重装不如更换帐户
16次
vb. net介绍
13次
Photoshop移花接木:照片换脸术
Copyright © 2008
MaiCoo.Com
All Rights Reserved
浙ICP备06017818号