我只是想知道objective-c中所有条件语句之间的差异以及哪一个更快更轻。
答案 0 :(得分:13)
一条建议:不要担心哪种语言结构在显微镜下比其他语言结构更快或更慢,而是专注于哪些语言结构让你表达自己最好。
答案 1 :(得分:9)
答案 2 :(得分:5)
与语言无关的版本(大多数情况下,这显然不包括声明性语言或其他奇怪的版本):
当我被教授编程时(很久以前,我会自由地承认),一种语言包含三种执行指令的方式:
if
和case
语句都是选择的变体。 If
用于根据条件(使用伪代码)选择两个不同选项之一:
if condition:
do option 1
else:
do option 2
请注意,可能不需要else
,在这种情况下它有效else do nothing
。还要记住,选项1或2也可以包含任何语句类型,包括更多if
语句(称为嵌套)。
Case
略有不同 - 它通常意味着两个以上的选择,例如当你想根据角色做不同的事情时:
select ch:
case 'a','e','i','o','u':
print "is a vowel"
case 'y':
print "never quite sure"
default:
print "is a consonant"
请注意,您可以将case
用于两个选项(甚至一个),但这有点像使用热核弹头杀死苍蝇。
While
不是选择变体,而是迭代变体。它属于for
,repeat
,until
以及许多其他可能性。
至于哪个是最快的,在浩大的大多数情况下并不重要。编译器编写者比我们的凡人更了解如何从他们的代码中获得最后一点性能。你要么信任他们正确地完成他们的工作,要么你自己用汇编代码(我更喜欢前者)。
通过专注于宏视图而不是次要事物,您将获得更多性能。这包括选择适当的算法,分析和定位热点。找到每月花费五分钟并在两分钟内完成运行的东西几乎没什么用。最好每分钟对发生的事情进行较小的改进。
if
,while
,case
之类的语言结构已经尽可能快,因为它们被大量使用并且相对简单。您应该首先编写代码以提高可读性,并且只有在性能成为问题时才会担心性能(请参阅YAGNI)。
即使您发现使用if/goto
组合而不是case
允许您运行得更快一点,但由此产生的源代码可能更难以维持在轨道上。
答案 3 :(得分:1)
虽然不是条件,但它是一个循环。不同之处在于while循环的主体可以执行多次,条件的主体只会执行一次或根本不执行。
if和switch之间的区别在于,如果接受任意表达式作为条件并且switch只接受要比较的值。基本上如果你有一个像if(x==0) {} else if(x==1) {} else if(x==2) ...
这样的结构,可以通过使用switch来更简洁(更有效)地编写它。
答案 4 :(得分:1)
案例陈述可以写成
if (a)
{
// Do something
}
else if (b)
{
// Do something else
}
但是案例效率更高,因为它只评估条件一次然后分支。
while
仅在您需要评估条件以及多次执行关联的代码块时才有用。如果您希望条件只出现一次,那么它相当于if
。更恰当的比较是while
是一个更通用的for
。
答案 5 :(得分:1)
每个条件语句都有不同的用途,在任何情况下都不会使用相同的语句。了解哪些适合哪种情况,然后编写代码。如果您对代码进行了分析并发现存在瓶颈,那么您可以继续解决它。在实际出现问题之前不要担心优化。
答案 6 :(得分:1)
您是否询问if结构是否比大循环内的switch语句执行得更快?如果是这样,我将快速测试放在一起,这段代码被放入我刚刚在最新的Xcode和iPhone SDK中创建的基于视图的新项目的viewDidLoad方法中:
NSLog(@"Begin loop");
NSDate *loopBegin = [NSDate date];
int ctr0, ctr1, ctr2, ctr3, moddedNumber;
ctr0 = 0;
ctr1 = 0;
ctr2 = 0;
ctr3 = 0;
for (int i = 0; i < 10000000; i++) {
moddedNumber = i % 4;
// 3.34, 1.23s in simulator
if (moddedNumber == 0)
{
ctr0++;
}
else if (moddedNumber == 1)
{
ctr1++;
}
else if (moddedNumber == 2)
{
ctr2++;
}
else if (moddedNumber == 3)
{
ctr3++;
}
// 4.11, 1.34s on iPod Touch
/*switch (moddedNumber)
{
case 0:
ctr0++;
break;
case 1:
ctr1++;
break;
case 2:
ctr2++;
break;
case 3:
ctr3++;
break;
}*/
}
NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:loopBegin];
NSLog(@"End loop: %f seconds", elapsed );
此代码示例并非完整,因为如前所述,如果您的情况比其他情况多出现,您当然希望将该代码放在前面以减少比较总数。它确实表明,在决策在分支之间或多或少地平均分配的情况下,if结构将执行得更快。
另外,请记住,这个小测试的结果在设备上运行与在模拟器中运行之间的性能差异很大。代码注释中引用的时间在实际设备上运行。 (第一次显示的是第一次运行代码时运行循环的时间,第二次是在没有重建的情况下再次运行相同代码的时间。)
答案 7 :(得分:0)
有conditional statements和conditional loops。 (如果要信任维基百科,那么在编程中简单地引用“条件”就不包括条件循环。但这是一个次要的术语问题。)
Shmoopty说:“由于这些陈述做了不同的事情,辩论哪个更快是没有意义的。”
嗯......可能是时间花了很少,但它不是荒谬的。例如,假设您有if
语句:
if (cond) {
code
}
您可以将其转换为最多执行一次的循环:
while (cond) {
code
break;
}
后者在几乎所有语言中都会变慢(或者相同的速度,因为优化器在幕后将其变回原来的if
!)但是,有时在计算机编程中(由于奇怪的情况)令人费解的事情跑得更快
但这些事件很少见。重点应该放在你的代码上 - 什么使它更清晰,什么能抓住你的意图。
答案 8 :(得分:-1)
循环和分支很难简单解释,以任何c风格语言从构造中获取最佳代码取决于所使用的处理器和代码的本地上下文。主要目标是减少执行流水线的破坏 - 主要是通过减少分支误预测。
我建议您 go here 满足您的所有优化需求。这些手册是为c风格的程序员编写的,如果你知道一些程序集,则相对容易理解。这些手册应该向您解释现代处理器中的细微之处,顶级编译器使用的策略,以及构建代码以最大限度地利用它的最佳方法。
答案 9 :(得分:-4)
我只记得有关条件和分支代码的最重要的事情。订购代码如下
if(x==1); //80% of the time
else if(x==2); // 10% of the time
else if(x==3); //6% of the time
else break;
您必须使用else序列...在这种情况下,CPU中的预测逻辑将正确预测x==1
,并避免在80%的执行中断开管道。
More information。特别:
为了有效地编写代码以利用这些规则,在编写if-else或switch语句时,首先检查最常见的情况,然后逐步降低到最不常见的情况。对于静态分支预测,循环不一定需要任何特殊的代码排序,因为通常只使用循环迭代器的条件。
通过遵循此规则,您将平坦,提供CPU提示,了解如何将其预测逻辑偏向您的链式条件。