switch/case和多态的性能比较

时间:2022-08-10 21:55:29
想讨论一下两种代码的性能比较。
一种是传统的C实现,用switch/case根据对象的类型进行不同的操作。
另一种是用多态/虚函数实现同样的操作。

有人研究过哪种更快吗?有实际测试数据就更好了。

9 个解决方案

#1


具体问题具体分析。
不过性能方面一般来说差别应该不大,会很小。
多态会静态产生一个vtable,每次调用时直接用指针函数。
switch/case语句通常计算机也会翻译成查表功能,
但是需要判断查表结构,然后决定调用那个函数。
从这方面来说,switch/case多使用了一次判断语句。
但是从另外一方面来说,如果实际上在某个地方,你会总是只调用其中一个函数,
那么switch/case情况编译器很容易优化掉,就变成一个对函数的直接调用,而变成直接调用后,一个更大的好处是函数经常可以被inline掉。
而使用多态,现在一般的编译器都做不了devirtualization,所以无法优化,还是一个间接函数调用,在这种情况,用switch/case更好。

#2


用C的switch/case来实现据对象的类型进行不同的操作效率高一点,但是不容易管理代码;
用C++的多态,管理更容易,而且有很多附加的功能,如vtable,可以实现后绑定,这是COM/ActiveX的基础。

如果不是对效率特别贴别特别敏感,还是用C++的多态吧。

#3


这个很难比较的啊!基本上是把两种不同的东西来做比较

如果非说哪个效率好一些,那我感觉用switch/case效率要高一些,毕竟多态是一种RTTI机制实现的

但是换了是我,我肯定会继续问,那为什么不是仅仅使用switch/case,将多态废除呢?这又陷入了另一个问题的无止无休的讨论了,所

以,我自己先问,楼主就不要再往下问了。

如果想详细了解,去看这本书“ANSI/ISO C++ Professional Programmer's Handsbook”的RTTI部分

#4


还可以从另外一个角度看他们的效率:前者在编译前就绑定了对象信息;后者是在编译后绑定的,也就是在运行中决定应该使用那个对象。前绑定和后绑定的关系不一样。

#5


狂顶!o(∩_∩)o

#6


楼主有性能问题吗?

#7


各有千秋呀~~~
switch给编译器更多的优化空间.但优化条件比较苛刻,一些情况并不会优化.比如一般O2优化,VC都不会做跳转表,只有Ox才会.而且不是所有情况都能用跳转表.如果用比较指令的话,就很慢了.
多态由于本身是在代码段里实现,一般不涉及数据段的东西.所以执行起来会快一点...但带来了函数的开销.
但通常switch的好处会多一点.

#8


我看了一篇讨论这个问题的论文,它用几种常用的C++编译器进行了测试。
其结论是:
- 如果打开优化开关,switch/case和多态方法执行时间基本一样。(在他的测试程序中,case里直接执行某段操作,没有函数调用这一层)。
- 如果优化开关不打开(VC++, GCC),多态明显要比switch/case慢。

对于优化开关不打开这种情况,我觉得是因为多态方法多了函数调用这一层,所以慢了。

#9


其实这两种方法在性能上区别不是很大。应用程序的性能不会因为选择其中之一而受到影响。性能的主要方面在于数据结构和算法。

#1


具体问题具体分析。
不过性能方面一般来说差别应该不大,会很小。
多态会静态产生一个vtable,每次调用时直接用指针函数。
switch/case语句通常计算机也会翻译成查表功能,
但是需要判断查表结构,然后决定调用那个函数。
从这方面来说,switch/case多使用了一次判断语句。
但是从另外一方面来说,如果实际上在某个地方,你会总是只调用其中一个函数,
那么switch/case情况编译器很容易优化掉,就变成一个对函数的直接调用,而变成直接调用后,一个更大的好处是函数经常可以被inline掉。
而使用多态,现在一般的编译器都做不了devirtualization,所以无法优化,还是一个间接函数调用,在这种情况,用switch/case更好。

#2


用C的switch/case来实现据对象的类型进行不同的操作效率高一点,但是不容易管理代码;
用C++的多态,管理更容易,而且有很多附加的功能,如vtable,可以实现后绑定,这是COM/ActiveX的基础。

如果不是对效率特别贴别特别敏感,还是用C++的多态吧。

#3


这个很难比较的啊!基本上是把两种不同的东西来做比较

如果非说哪个效率好一些,那我感觉用switch/case效率要高一些,毕竟多态是一种RTTI机制实现的

但是换了是我,我肯定会继续问,那为什么不是仅仅使用switch/case,将多态废除呢?这又陷入了另一个问题的无止无休的讨论了,所

以,我自己先问,楼主就不要再往下问了。

如果想详细了解,去看这本书“ANSI/ISO C++ Professional Programmer's Handsbook”的RTTI部分

#4


还可以从另外一个角度看他们的效率:前者在编译前就绑定了对象信息;后者是在编译后绑定的,也就是在运行中决定应该使用那个对象。前绑定和后绑定的关系不一样。

#5


狂顶!o(∩_∩)o

#6


楼主有性能问题吗?

#7


各有千秋呀~~~
switch给编译器更多的优化空间.但优化条件比较苛刻,一些情况并不会优化.比如一般O2优化,VC都不会做跳转表,只有Ox才会.而且不是所有情况都能用跳转表.如果用比较指令的话,就很慢了.
多态由于本身是在代码段里实现,一般不涉及数据段的东西.所以执行起来会快一点...但带来了函数的开销.
但通常switch的好处会多一点.

#8


我看了一篇讨论这个问题的论文,它用几种常用的C++编译器进行了测试。
其结论是:
- 如果打开优化开关,switch/case和多态方法执行时间基本一样。(在他的测试程序中,case里直接执行某段操作,没有函数调用这一层)。
- 如果优化开关不打开(VC++, GCC),多态明显要比switch/case慢。

对于优化开关不打开这种情况,我觉得是因为多态方法多了函数调用这一层,所以慢了。

#9


其实这两种方法在性能上区别不是很大。应用程序的性能不会因为选择其中之一而受到影响。性能的主要方面在于数据结构和算法。