c语言case和if-else的区别,关于性能:case与if else if:哪个更有效?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:

is “else if” faster than “switch() case” ?

What is the relative performance of if/else vs. switch in Java?

我又在运行中编码了……当调试器单步执行case语句时,它会立即跳转到与条件匹配的项,但是当使用if/else指定相同的逻辑时,它会单步执行every if语句,直到找到获胜者。case语句更有效,还是我的调试器只是在优化步骤?(不要担心语法/错误,我把它输入了so,不知道它是否会编译,这是我所追求的原则,我不想把它们作为in t,因为我模糊地记得一些关于case使用带in t的偏移量的情况)我使用c,但我对跨编程语言的一般答案感兴趣。

switch(myObject.GetType()){

case typeof(Car):

//do something

break;

case typeof(Bike):

//do something

break;

case typeof(Unicycle):

//do something

break;

case default:

break;

}

VS

Type myType = myObject.GetType();

if (myType == typeof(Car)){

//do something

}

else if (myType == typeof(Bike)){

//do something

}

else if (myType == typeof(Unicycle)){

//do something

}

else{

}

这甚至不接近于语言不可知论,任何答案都将与一种特定的语言紧密相连。

更不用说特定的编译器和编译器版本。

它可能因语言、编译器和运行时而异。没办法确定。

这甚至不是特定语言。它完全依赖于一个特定的编译器实现,甚至在那时也不可能100%负责(例如,可能某些形式的if语句的优化方式与其他语句不同)。

Java视角中的类似问题:StAdvExoL.COM/问题/ 2086529/& Helip;

顺便说一句:这个问题的真正答案是让他们都实现一个通用的接口/抽象方法,例如Vehicle#doSomething(),并且在具体的实现中定义了每个方法,这样你就可以得到myObject.doSomething()。

php,if/else的解析速度更快。

似乎编译器在优化switch语句方面优于if语句。

编译器不知道计算if语句的顺序对您是否重要,并且无法在那里执行任何优化。您可以在if语句中调用方法,从而影响变量。使用switch语句,它知道所有子句都可以同时进行计算,并且可以将它们按最有效的顺序放置。

下面是一个小的比较:http://www.blackwasp.co.uk/speedtestifelswitch.aspx

我不理解这一部分"你可能在if语句中调用方法,影响变量"如果不是,这怎么会发生?我想是一样的。

如果(+i)…..},但在switch case语句中不能这样做。

调试器使其更简单,因为您不想单步执行编译器创建的实际代码。

如果开关包含五个以上的项,则使用查找表或哈希表实现,否则使用if..else实现。

看到密切相关的问题是"else if"快于"switch()case"?.

当然,除了C语言以外的其他语言或多或少也会实现它,但是切换通常更有效。

许多编程语言都对switch语句进行了优化,因此如果结构提供的情况是编译器常量,那么它比标准if else快得多。许多语言使用跳转表或索引分支表来优化switch语句。维基百科对switch语句有很好的讨论。此外,本文还讨论了C语言中的开关优化问题。

需要注意的一点是,switch语句可能会被滥用,根据具体情况,最好使用多态性而不是switch语句。请参阅此处以获取示例。

维基百科的switch语句条目相当大,实际上相当好。有趣的地方:

开关本身并不快。它取决于语言、编译器和特定用途。

编译器可以使用跳转表或索引函数指针优化开关。

这个声明是由斯蒂芬克莱恩(以及其他人)的一些有趣的数学启发而来的。

有关使用C开关进行的奇怪而有趣的优化,请参阅Duff的设备。

它可以对case语句执行此操作,因为值是编译器常量。这里有一个更详细的解释:http://sequence-points.blogspot.com/2007/10/why-is-switch-statement-faster-than-if.html

我相信,因为cases必须是常量值,switch语句实现goto的相等性,因此基于变量的值,它跳到正确的case,而在if/then语句中,它必须计算每个表达式。

我认为这只是使它简单化的调试器。请注意,案例和"if list"最终是不同的。有一个原因可以解释为什么事例块通常以"break"结尾。案例stmt在组装中分解时实际上看起来像这样。

if myObject.GetType() == type of Car

GOTO START_CAR

else if myObject.GetType() == type of Bike

GOTO START_BIKE

LABEL START_CAR

//do something car

GOTO END

LABEL START_BIKE

//do something bike

GOTO END

LABEL END

如果你没有休息,那么箱子块会丢失"goto end"stmts,事实上,如果你落在"car"箱子里,你实际上会运行这两个部分。

//do something car

//do something bike

GOTO END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值