方法调用成本是否随着更多接口实现而保持不变

use*_*597 1 c# java performance

让我们说我们有一个"ISomething"接口,方法是"DoSomething".
我们创建了多个实现它的类.示例5/10/100/1000新类定义.

将迭代List <ISomething>并且调用DoSomething()花费相同的时间,而不管添加到列表中的#unique类.假设列表包含相同数量的对象.不同类型的比较列表与相同类型的列表.

本质上我问的是接口方法调用是否始终是"常量"运行时成本,或者它取决于它背后的#唯一类型.

我为什么这么问?我需要了解界面如何在幕后工作,以免触发意外开销.

编辑:我可以提出更难的问题吗?
让我们考虑相反的情况,我们现在只有1个类,但它实现了N个接口(ISomething1 ... N).无论在它实现的#interfaces上,性能是否相同.让我们说大多数接口最终都指向同一个方法.

Edit2: adjan的答案提出了另一个潜在问题:
他说c#为每个接口生成一个v表=>所有方法都花费O(1).

让我们考虑以下场景.
垂直继承链:A0延伸A1延伸A2 ...延伸AN.
我们构造它们的所有这些类都没有变量.
我们刚刚创建了一个性能错误.

A0.method()花费O(N).
I0.method()花费O(1).

如果接口可以以恒定的开销完成工作,那么如果有人滥用继承机制并创建深度为N的垂直树分支,为什么要支付可变成本.

A0虚拟方法是否花费O(N)?它的构造函数或它的析构函数,我们100%安全地假设它需要不断的运行时成本.关于构造函数,对A0的构造函数的调用触发A1的无参数构造函数,因此调用链继续...因此O(N)成本.

Bra*_*NET 6

首先; 这种过早的优化是疯狂的.通过接口调用所涉及的开销并不重要.

也就是说,除非您正在处理分支预测,否则混合类型不会产生运行时影响.(请参阅为什么处理排序数组比处理未排序数组更快?).

这样做的原因是,无论是否反复选择相同的虚拟函数指针表,都会产生调用虚拟函数指针表的开销.真; 它不是你需要担心的事情.