为什么OfType比Cast快?回答以下问题:HowtoconvertMatchCollectiontostringarray给定两个Linq表达式:vararr=Regex.Matches(strText,@"b[A-Za-z-']+b").OfType()//OfType.Select(m=>m.Groups[0].Value).ToArray();和vararr=Regex.Matches(strText,@"b[A-Za-z-']+b").Cast()//Cast.Select(m=>m.Groups[0].Value).ToArray();OfType由用户Alex进行基准测试,速度稍快(并由我自己确认)。这对我来说似乎违反直觉,因为我认为OfType必须同时进行“is”比较和cast(T)。任何关于为什么会出现这种情况的启示将不胜感激:)我的基准与你的不一致。我运行了与Alex相同的基准测试,但得到了相反的结果。然后我稍微调整了基准并再次观察到Cast比OfType更快。它们并不多,但我相信Cast确实有优势,因为它具有更简单的迭代器。(不是检查。)编辑:实际上,经过进一步调整后,我设法使Cast比OfType快50倍。这是基准测试的代码,它给出了迄今为止我发现的最大差异:Stopwatchsw1=newStopwatch();秒表sw2=new秒表();varma=Enumerable.Range(1,100000).Select(i=>i.ToString()).ToArray();varx=ma.OfType().ToArray();vary=ma.Cast().ToArray();对于(inti=0;i().ToArray();sw1.Stop();sw2.Start();vararr2=ma.Cast().ToArray();sw2.Stop();}else{sw2.Start();vararr2=ma.Cast().ToArray();sw2.Stop();sw1.Start();vararr=ma.OfType().ToArray();sw1.Stop();}}Console.WriteLine("OfType:"+sw1.ElapsedMilliseconds.ToString());Console.WriteLine("Cast:"+sw2.ElapsedMilliseconds.ToString());Console.ReadLine();我做的调整:在我的机器上,这导致Cast为~350ms,OfType为~18000ms。我认为最大的区别是我们不再计算MatchCollection需要多长时间才能找到下一个匹配项。(或者,在我的代码中,int.ToString()需要多长时间需要。)这大大降低了噪声比。编辑:正如六个变量所指出的,造成这种巨大差异的原因是Cast短路并且不会打扰单个项目,因为它可以投射整个IEnumerable。当我切换时从使用Regex.Matches到数组,为了避免测量正则表达式处理时间,我还切换到使用可以将Regex.Matches到IEnumerable的东西,从而激活这个短路。当我更改基准以禁用此短路时,我获得了一个小优势,而不是一个巨大的优势。OfType()应该更慢,因为类型安全检查是在实际显式转换操作之前执行的,而Cast()只执行显式转换。理论上OfType在许多元素具有“错误类型”的情况下会更快,因此循环在检查后进一步枚举,如果Cast()在同一集合上,您将在“错误类型”的每个元素上EndInvalidCastException.所以这会比较慢。使用ILSpy提取的源代码://System.Linq.EnumerableprivatestaticIEnumerableOfType(IEnumerablesource){if(source==null){throwError.ArgumentNull("source");}foreach(objectcurrentinsource){//**类型检查**if(currentisTResult){//**显式转换**yieldreturn(TResult)current;}}产量中断;}//System.Linq.EnumerablepublicstaticIEnumerableCast(thisIEnumerablesource){IEnumerableenumerable=sourceasIEnumerable;如果(可枚举!=null){返回可枚举;}if(source==null){抛出错误。ArgumentNull("来源");}foreach(objectcurrentinsource){//**仅显式转换**yieldreturn(TResult)current;产量中断;只需在您的方法中反转OfType和Cast的顺序,您就会发现没有任何区别。第一个总是比第二个跑得快。这是一个糟糕的微基准测试案例。将代码包装在一个循环中以随机顺序运行它们:OfType:1224Cast:2815Cast:2961OfType:3010OfType:3027Cast:2987...然后:Cast:1207OfType:2781Cast:2930OfType:2964OfType:2964OfType:2987...取消设置Regex.Matches,这似乎会导致问题:Cast:1247OfType:210OfType:170Cast:171...和OfType:1225Cast:202OfType:171Cast:192Cast:415所以不行。OfType并不比Cast快。不,Cast并不比OfType快。实际上isof()首先检查类型,然后转换它,其中cast()只是第二部分。所以很明显isof()会比直接cast慢http://codenets.blogspot.in/2010/06/cast-vs-oftype.html以上是C#学习教程:为什么OfType比Cast快?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
