DotNet并行计算的使用误区(二)
上接 html" target=_blank>DotNet并行计算的使用误区(一)
● 误区三 . 并行计算是运行时的事
的确,DotNet会在运行时决定是否使用并行库处理代码,但是早在你编译代码时,编译器就早已为这一时刻做好准备,换就话说:
1. 使用并行库处理代码与普通方式对比,IL的结构是不同的。
2. 即使你选择使用并行计算,并且你也确实拥有多核(线程)CPU,运行时你的代码也不一定是并行的。
使用TPL后CLR可能会分解任务,这一依据的其中之一是由IL支持的,IL将并行的任务代码分离,以便在将来的操作中并行,这一点可以从以下的示例中看出来,以下两段示例的核心C#代码都是Tostring()和Sleep(),Code A使用For包含Sleep,Code B使用Parallel.For处理:
Code Part A:
IL:
IL_000e: callvirt instance void [System]System.Diagnostics.Stopwatch::Start()
IL_0013: nop
IL_0014: ldc.i4.0
IL_0015: stloc.2
IL_0016: br.s IL_0031
IL_0018: nop
IL_0019: ldloca.s i
IL_001b: call instance string [mscorlib]System.Int32::ToString()
IL_0020: stloc.0
IL_0021: ldc.i4 0xc8
IL_0026: call void [mscorlib]System.Threading.Thread::Sleep(int32)
IL_002b: nop
IL_002c: nop
IL_002d: ldloc.2
IL_002e: ldc.i4.1
IL_002f: add
IL_0030: stloc.2
IL_0031: ldloc.2
IL_0032: ldc.i4.s 10
IL_0034: clt
IL_0036: stloc.3
IL_0037: ldloc.3
IL_0038: brtrue.s IL_0018
IL_003a: ldloc.1
IL_003b: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop()
我们注意到,Code Part A的Sleep是直接出现在Load方法中的。
再来看看Parallel方式:
Code Part B:
Form1_Load:
IL_0019: callvirt instance void [System]System.Diagnostics.Stopwatch::Start()
IL_001e: nop
IL_001f: ldc.i4.0
IL_0020: ldc.i4.s 10
IL_0022: ldloc.1
IL_0023: ldftn instance void WindowsFormsApplication4.Form1/<>c__DisplayClass1::<Form1_Load>b__0(int32)
IL_0029: newobj instance void class [mscorlib]System.Action`1<int32>::.ctor(object,
native int)
IL_002e: call valuetype [mscorlib]System.Threading.Tasks.ParallelLoopResult[mscorlib]System.Threading.Tasks.Parallel::For(int32,
int32,
class [mscorlib]System.Action`1<int32>)
IL_0033: pop
IL_0034: ldloc.0
IL_0035: callvirt instance void [System]System.Diagnostics.Stopwatch::Stop()
注意红色字体,Sleep已经不在Load方法中了,而是被一个“b__0”代替,并行代码与宿主代码分离,以下就是b__0的IL:
.method public hidebysig instance void <Form1_Load>b__0(int32 i) cil managed
{
// 代码大小 26 (0x1a)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarga.s i
IL_0004: call instance string [mscorlib]System.Int32::ToString()
IL_0009: stfld string WindowsFormsApplication4.Form1/<>c__DisplayClass1::a
IL_000e: ldc.i4 0xc8
IL_0013: call void [mscorlib]System.Threading.Thread::Sleep(int32)
IL_0018: nop
IL_0019: ret
} // end of method <>c__DisplayClass1::<Form1_Load>b_补充:Web开发 , ASP.Net ,
- 更多asp疑问解答:
- asp正则过滤重复字符串的代码
- 用asp过滤全部html但保留br类似的符号
- 会asp,但感觉asp要过点,想学php。但我一般做的都是小公司的站,用access数
- PHP的空间可以用ASP的源代码吗?
- 以前做asp程序,现在应该怎样发展?是学.net还是php
- 以前做asp程序,现在应该怎样发展?是学.net还是php
- 想做一个市级的人才网acess,sql数据库,语言asp,jsp,php分别用哪种好
- jsp,asp,php 区别
- 我想找一个有比较多漏洞的网站的源码,比如可以asp,php注入等都可以。供学习研究用。请提供下载地址。。
- 现在候找人做个网站,用ASP,还是PHP语言去做好
- asp,php ,jsp,.net 对于做网站前台的重要吗?
- asp和php的区别是什么?
- 我是新手SEO菜鸟 请问wp dw php asp cms myspl dede 这些软件应该如何区分呀?
- 网页制作相关的三种语言:ASP JSP PHP那个好点,简单点?
- 网页制作相关的三种语言:ASP JSP PHP那个好点,简单点?
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,
部分文章来自网络,