c# - 使用具体类型而不是接口(interface)在性能方面是否更好

标签 c# .net performance

我遇到了一些规则(建议)来使用具体的 ListDictionary 而不是 IListIDictionary,鉴于显示通过界面访问的示例测试要慢得多。例如,将 10000 个值添加到列表,然后对列表执行 Count 10 亿次表明通过接口(interface)执行此操作比通过具体类执行慢 28 倍。也就是说,通过具体类需要 80 毫秒,通过接口(interface)需要 2800 毫秒,这表明通过接口(interface)的速度真的很慢。鉴于此,使用具体类是合理的。界面这么慢是有原因的吗? (可能更针对那些更了解 .net 内部结构的人)。

最佳答案

我认为如果你看一下反汇编就很明显了:

IList 版本编译为:

            for (int i = 0; i < 1000000000; i++) 
0000003d  xor         edi,edi 
            { 
                count = lst.Count; 
0000003f  mov         ecx,esi 
00000041  call        dword ptr ds:[00280024h] 
00000047  mov         ebx,eax 
            for (int i = 0; i < 1000000000; i++) 
00000049  inc         edi 
0000004a  cmp         edi,3B9ACA00h 
00000050  jl          0000003F 
            }

IList.Count的访问被编译成一条call指令。

另一方面,List 版本是内联的:

            for (int i = 0; i < 1000000000; i++) 
0000003a  xor         edx,edx 
0000003c  mov         eax,dword ptr [esi+0Ch] 
0000003f  mov         esi,eax 
00000041  inc         edx 
00000042  cmp         edx,3B9ACA00h 
00000048  jl          0000003F 
            }

这里没有call指令。循环中只有一条 mov、inc、cmp 和 jl 指令。当然这样更快。

但请记住:通常,您是列表的内容进行操作,而不仅仅是遍历它。这通常比单个函数调用花费的时间长得多,因此调用接口(interface)方法很少会导致任何性能问题。

关于c# - 使用具体类型而不是接口(interface)在性能方面是否更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4256928/

相关文章:

database - 小文件海量存储策略

c++ - 在合适的情况下编写索引是否比仅从 c++ 中的性能 POV 的 for 循环更好?

c# - 如何获取接口(interface)方法的MethodInfo,实现了类方法的MethodInfo?

c# - 从属性名称的字符串创建表达式?

.net - Intellisense不显示引用的DLL的XMLDOC

c - 切换大量 case 与单个 if

c# - 在部分类中实现接口(interface)

c# - 对于可观察的集合列表,检查LINQ返回是否为null

.net - App.config和F#Interactive无法正常工作

c# - 目录中的文件按文件名升序排序