代码之家  ›  专栏  ›  技术社区  ›  martijn_himself

接口和工厂引入的间接性如何影响性能?

  •  1
  • martijn_himself  · 技术社区  · 14 年前

    我想改进一些遗留代码的可测试性。为了实现这一点,我将为现有类(并让现有类实现这些类)和工厂引入接口,这些接口根据某些配置设置创建测试对象的实例或原始类的对象。

    我可以预见到一些内部反馈沿着“但是这会影响性能”,但是我希望能够测试一些代码(对于本例中的服务层),而不必部署所有底层和设置数据库服务器。

    你有没有经历过间接引入会显著影响绩效?对上述反馈有何建设性的回应?

    谢谢,

    马蒂恩

    3 回复  |  直到 14 年前
        1
  •  3
  •   Frank    14 年前

    根据Don Box的一本书(Essential.NET第1卷),与在类上调用函数相比,在接口上调用函数的效果是一条机器指令,因为还有一条间接指令。这意味着在2 GHz处理器上,调用接口方法比类方法慢0.000000000005秒。

    这是指.NET版本1的实现(我有本书的旧版本)。我不确定新版本是否会有很大的变化,或者它是如何应用于单声道的,但我绝对不会假设有戏剧性的效果。

    正如你所看到的,在现代计算机上,这种影响应该是可以忽略的,除非在罕见的情况下,你必须每纳秒猎取一次。

        2
  •  1
  •   stevemegson    14 年前

    简短的回答:这一点也不会有什么不同。

    更长的答案是:几乎可以肯定,这一点都没有区别。唯一真正的性能差异应该是通过接口调用的方法不能被内联,所以任何在原始类上内联的方法都将与接口一起变慢。不过,我们每次通话只会多说几纳秒,所以 如果 您在类上有内联方法,并且 如果 他们被打了上百万次电话,那么你可能会看到明显的区别。但是,如果您有这样一种方法,它是应用程序性能的限制因素,那么性能爱好者肯定已经测量过了,并且能够告诉您。他们不会吗?

        3
  •  1
  •   Hans Passant    14 年前

    接口方法调用的唯一区别在于 放心 是一个虚拟方法调用。对于直接类实例方法调用,它是可选的,这取决于您是否声明它为虚拟的。

    实际上,它没有任何区别,vb.net编译器使用与C编译器相同的技巧。即使方法不是虚拟的,它也会进行间接调用,这对于隐式的空引用检查很有用。只有静态方法调用可能更便宜。

    没必要担心这个。