当我写作时,有人可以准确地(或多或少地)向我解释幕后发生的事情(即在CLR中):
public voID myMethod(IEnumerable<string> List){ foreach (string s in List) { Console.Writeline(s); }}static voID Main(){ List<string> List = new List<string>(new string[] {"a","b","c"}); myMethod(List);}
和有什么区别:
public voID myMethod(List<string> List){ foreach (string s in List) { Console.Writeline(s); }}static voID Main(){ List<string> List = new List<string>(new string[] {"a","c"}); myMethod(List);}解决方法 你担心表现 – 但你有任何理由担心这个问题吗?我的猜测是你根本没有对代码进行基准测试.在使用性能更高的代码替换可读,干净的代码之前始终进行基准测试
在这种情况下,对Console.Writeline的调用无论如何都将完全支配性能.
虽然我怀疑使用List< T>之间的性能可能存在理论上的差异.和IEnumerable< T>在这里,我怀疑在现实世界的应用程序中它具有重要意义的案例数量正在逐渐减少.
它甚至不是用于许多 *** 作的序列类型 – 只有一次调用GetEnumerator(),它被声明为返回IEnumerator< T>.无论如何.随着列表变大,两者之间的性能差异将变得更小,因为它只会在循环开始时产生任何影响.
但是,忽略分析,要做的就是在对其进行编码决策之前测量性能.
至于幕后发生的事情 – 你必须深入研究每种情况下元数据中究竟是什么的深层细节.我怀疑在接口的情况下,有一个额外的重定向级别,至少在理论上 – CLR必须解决目标对象类型中IEnumerable< T>的vtable的位置.是,然后调用适当的方法的代码.在List< T>的情况下,JIT将知道开始的vtable中的正确偏移,而没有额外的查找.这只是基于我对JITting,thunking,vtables以及它们如何应用于接口的朦胧理解.它可能略有错误,但更重要的是它是一个实现细节.
总结以上是内存溢出为你收集整理的c# – 更改为通用接口对性能的影响全部内容,希望文章能够帮你解决c# – 更改为通用接口对性能的影响所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)