我遇到了一些规则(建议)来使用具体的 List
和 Dictionary
而不是 IList
和 IDictionary
,鉴于显示通过界面访问的示例测试要慢得多。例如,将 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/