Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 接口和工厂引入的间接寻址如何影响性能?_.net_Vb.net_Design Patterns - Fatal编程技术网

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

.net 接口和工厂引入的间接寻址如何影响性能?,.net,vb.net,design-patterns,.net,Vb.net,Design Patterns,我想改进一些遗留代码的可测试性。为了实现这一点,我引入了现有类的接口(并让现有类实现这些接口)和工厂,它们根据一些配置设置创建测试对象的实例或原始类的对象 我可以预见一些类似“但这会影响性能”的内部反馈,但我希望能够测试一些代码(在这种情况下是针对服务层的),而不必部署所有底层和设置数据库服务器 您是否有过这样的经验:引入的间接操作确实会显著影响性能?什么样的建设性方式可以回应上述反馈 谢谢 Martijn根据Don Box(Essential.NET第1卷)的一本书,与在类上调用函数相比,在接

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

我可以预见一些类似“但这会影响性能”的内部反馈,但我希望能够测试一些代码(在这种情况下是针对服务层的),而不必部署所有底层和设置数据库服务器

您是否有过这样的经验:引入的间接操作确实会显著影响性能?什么样的建设性方式可以回应上述反馈

谢谢


Martijn

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

这是指.NETRelease1实现(我有本书的旧版本)。我不确定新版本是否改变了很多,或者它如何应用于Mono,但我绝对不会假设会有戏剧性的效果


正如你所见,在现代计算机上,这种影响应该是可以忽略的,除非在极少数情况下,你必须每纳秒搜寻一次。

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

这是指.NETRelease1实现(我有本书的旧版本)。我不确定新版本是否改变了很多,或者它如何应用于Mono,但我绝对不会假设会有戏剧性的效果


正如你所见,在现代计算机上,这种影响应该是可以忽略的,除非在极少数情况下,你必须寻找每一纳秒。

简单的答案是:这根本没有什么区别


较长的答案是:这几乎肯定不会有任何区别。唯一真正的性能差异应该是通过接口的方法调用不能内联,因此任何内联在原始类上的方法在接口上都会变慢。但是,我们只讨论每次调用的额外纳秒数,因此如果类上有内联方法,并且如果它们被调用数百万次,那么您可能会看到明显的差异。但是,如果您有这样一种方法,它是应用程序性能的限制因素,那么性能狂热者肯定已经测量过了,并且能够告诉您。他们不会吗?

简单的回答是:这根本没什么区别


较长的答案是:这几乎肯定不会有任何区别。唯一真正的性能差异应该是通过接口的方法调用不能内联,因此任何内联在原始类上的方法在接口上都会变慢。但是,我们只讨论每次调用的额外纳秒数,因此如果类上有内联方法,并且如果它们被调用数百万次,那么您可能会看到明显的差异。但是,如果您有这样一种方法,它是应用程序性能的限制因素,那么性能狂热者肯定已经测量过了,并且能够告诉您。不是吗?

接口方法调用的唯一区别是保证它是一个虚拟方法调用。它在直接类实例方法调用中是可选的,具体取决于您是否将其声明为虚拟的

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


没有必要担心这一点。

接口方法调用的唯一区别在于它保证是一个虚拟方法调用。它在直接类实例方法调用中是可选的,具体取决于您是否将其声明为虚拟的

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


没有必要担心这一点。

表演迷应该在地狱里烧死。如果它运行得足够快,让用户满意,那么它就足够快了。@delnan:嗯。。。PerfJunks应该学会如何测量。@Yves M:即使他们测量正确并找到合适的位置,再挤出6秒,他们仍然走错了方向。但是是的,没有分析的“优化”更糟糕。@delnan:我不是说你错了;-)。。。我想给瘾君子一个提示…我是唯一一个认为这种设计模式会降低可读性的人吗?性能瘾君子应该下地狱。如果它运行得足够快,让用户满意,那么它就足够快了。@delnan:嗯。。。PerfJunks应该学会如何测量。@Yves M:即使他们测量正确并找到合适的位置,再挤出6秒,他们仍然走错了方向。但是是的,没有分析的“优化”更糟糕。@delnan:我不是说你错了;-)。。。我想给吸毒者一个提示…我是唯一一个认为这种设计模式会降低可读性的人吗?