2017-04-05 58 views
1

以下两个代码片段的性能如何?为什么?对于switch语句使用不同的语法时,是否有任何可能的优化变化?

片段1:

switch(a) 
{ 
     case 1 ... 5: 
        printf("%d\n",a); 
        break; 
    case 6 ... 10: 
        printf("%d\n",a); 
        break; 
    default: 
      printf("%d\n",a); 
} 

片段2:

switch(a) 
{ 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
      printf("%d\n",a); 
      break; 
    case 6: 
    case 7: 
    case 8: 
    case 9: 
    case 10: 
      printf("%d\n",a); 
      break; 
    default: 
      printf("%d\n",a); 
} 
+1

以上是GCC扩展。很明显,为什么第二个更好 – StoryTeller

+0

前者甚至不会在标准C中编译。您正在使用哪种非标准编译器? – Lundin

+0

为什么不检查生成的汇编代码,对于初学者? –

回答

6

这两个片段都是相同,它们是不是不同。您只是使用不同的语法来编写代码,就这些了。

正如在评论中提到的,第一种方法使用gcc extension for case-range它允许你写更短代码的代价是可移植性,所以选择明智。

任何(half-decent)编译器,在生成程序集时,会生成相同的代码,所以在性能方面应该没有区别。

2

如有疑问轮廓它。

但请注意,第一个片段是而不是标准C(范围switch是一个值得注意的gcc编译器扩展),因此不可移植。

switch ((a - 1)/5)将是一个明显的选择,如果你不喜欢复制案例标签。但这可能会变慢;再次,分析它。据推测,你知道printf是国家英里的性能瓶颈?

+4

您的替代方案可能很容易写入,但在性能方面速度较慢,正如OP所询问的那样。也许你应该说出来。 – LoPiTaL