C 小开关语句与小if链? 在性能领域中考虑更有效?

C 小开关语句与小if链? 在性能领域中考虑更有效?,c,performance,if-statement,switch-statement,processing-efficiency,C,Performance,If Statement,Switch Statement,Processing Efficiency,一个小的开关语句,包含3个以下/3个以下的情况? 或 在3种条件下/3种条件下组成的小if链 例如: int x = 1; switch (x) { case 1: //....do something case 2: //....do something case 3: //....do something } 或 这两种方法都被认为是同样有效的吗?或者一条通过速度控制另一条吗?理论上,switch语句通常比if/els

一个小的开关语句,包含3个以下/3个以下的情况? 或 在3种条件下/3种条件下组成的小if链

例如:

int x = 1;
switch (x) {
    case 1:
        //....do something
    case 2:
        //....do something
    case 3:
        //....do something
}


这两种方法都被认为是同样有效的吗?或者一条通过速度控制另一条吗?

理论上,switch语句通常比if/else梯形图更快,因为switch语句在远程可能的情况下编译为jumptable。我的理解是,现代优化器也可以做到这一点,所以在实践中不会更快


在最坏的情况下,switch语句不会变慢,因此如果有疑问,请编写switch语句。此外,它更易于阅读,这几乎总是值得的。

两者都不是,无论您写什么,优化器都可能生成相同的代码。因此,请以最容易阅读的方式编写代码,并让优化器完成其工作。即使存在差异,对于一个小列表来说也可以忽略不计。有趣的一点是,我不断地读取开关速度更快,如果但通常它与大的开关语句和if链有关,这在最近的编译器版本中是否发生了变化?似乎许多关于相似性问题的答案都是老生常谈的。@Barmar关于蛮力/解密之类的问题呢?有什么区别吗?衡量并找出答案。我不同意。有更多的因素可以考虑,代码缓存、分支数量、ifs顺序等。如果频繁执行开关/If梯形图,您需要进行基准测试,结果有时令人惊讶。有时开关的速度可能比if-s慢3-4倍,而在另一种情况下,开关的速度可能快3-4倍。@PSkocik,现在我已经尝试过了,Debian的3.8.1-24叮当声似乎就是这样做的。一个简单的9路if序列(每个分支的内容基本相似)编译成与等效开关相同的跳转表。-改良重复example@ilkkachu哦,孩子。。。是的。是的。正如我写的——总是测试——不要分享myths@ty_c0der如果代码中有什么重要的东西-请始终进行测试。没有别的办法。
int x = 1:
if (x == 1) {
    //....do something
}
else if (x == 2) {
    //....do something
}
else if (x == 3) {
    //....do something
}