|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也许C#刚上市的时候有些抄袭Java吧,但自从C#2.0上市之后,整个局面就扭转乾坤了,不但Java在模仿C#,而且他从来都没能跟得上C#的脚步。<p>并行盘算或称平行盘算是相对串行盘算来讲的。所谓并行盘算可分为工夫上的并行和空间上的并行。工夫上的并行就是指流水线手艺,而空间上的并行则是指用多个处置器并发的实行盘算。
上接DotNet并行盘算的利用误区一
误区三.并行盘算是运转时的事
切实其实,DotNet会在运转时决意是不是利用并行库处置代码,可是早在你编译代码时,编译器就早已为这一时候做好筹办,换就话说:
1.利用并行库处置代码与一般体例对照,IL的布局是分歧的。
2.即便你选择利用并行盘算,而且你也的确具有多核(线程)CPU,运转时你的代码也纷歧定是并行的。
利用TPL后CLR大概会分化义务,这一根据的个中之一是由IL撑持的,IL将并行的义务代码分别,以便在未来的操纵中并行,这一点能够从以下的示例中看出来,以下两段示例的中心C#代码都是Tostring()和Sleep(),CodeA利用For包括Sleep,CodeB利用Parallel.For处置:
CodePartA:
IL:
<olclass="dp-c">IL_000e:callvirtinstancevoid[System]System.Diagnostics.Stopwatch::Start()IL_0013:nopIL_0014:ldc.i4.0IL_0015:stloc.2IL_0016:br.sIL_0031IL_0018:nopIL_0019:ldloca.siIL_001b:callinstancestring[mscorlib]System.Int32::ToString()IL_0020:stloc.0IL_0021:ldc.i40xc8IL_0026:callvoid[mscorlib]System.Threading.Thread::Sleep(int32)IL_002b:nopIL_002c:nopIL_002d:ldloc.2IL_002e:ldc.i4.1IL_002f:addIL_0030:stloc.2IL_0031:ldloc.2IL_0032:ldc.i4.s10IL_0034:cltIL_0036:stloc.3IL_0037:ldloc.3IL_0038:brtrue.sIL_0018IL_003a:ldloc.1IL_003b:callvirtinstancevoid[System]System.Diagnostics.Stopwatch::Stop()
我们注重到,CodePartA的Sleep是间接呈现在Load办法中的。
再来看看Parallel体例:
CodePartB:
Form1_Load:
<olclass="dp-c">IL_0019:callvirtinstancevoid[System]System.Diagnostics.Stopwatch::Start()IL_001e:nopIL_001f:ldc.i4.0IL_0020:ldc.i4.s10IL_0022:ldloc.1IL_0023:ldftninstancevoidWindowsFormsApplication4.Form1/c__DisplayClass1::<Form1_Load>b__0(int32)IL_0029:newobjinstancevoidclass[mscorlib]System.Action`1<int32>::.ctor(object,nativeint)IL_002e:callvaluetype[mscorlib]System.Threading.Tasks.ParallelLoopResult[mscorlib]System.Threading.Tasks.Parallel::For(int32,int32,class[mscorlib]System.Action`1<int32>)IL_0033:popIL_0034:ldloc.0IL_0035:callvirtinstancevoid[System]System.Diagnostics.Stopwatch::Stop()//注重,Sleep已不在Load办法中了,而是被一个“b__0”取代,并行代码与宿主代码分别,以下就是b__0的IL:.methodpublichidebysiginstancevoid<Form1_Load>b__0(int32i)cilmanaged{//代码巨细26(0x1a).maxstack8IL_0000:nopIL_0001:ldarg.0IL_0002:ldarga.siIL_0004:callinstancestring[mscorlib]System.Int32::ToString()IL_0009:stfldstringWindowsFormsApplication4.Form1/c__DisplayClass1::aIL_000e:ldc.i40xc8IL_0013:callvoid[mscorlib]System.Threading.Thread::Sleep(int32)IL_0018:nopIL_0019:ret}//endofmethodc__DisplayClass1::<Form1_Load>b__0
布局图:
以上的白色代码就是在CodeA中呈现的次要代码。再让我们重温一下这张图,IL的代码义务已很分明的唆使了出来。
<pstyle="text-align:center"> |
|