2013-06-13 38 views
1

我试图加速一个运行约100000次迭代的循环,并想知道if语句的顺序是否对性能有影响。例如,下面的代码会在每次执行for循环时执行else语句之前检查if和elseif吗?MATLAB:If语句的顺序是否影响性能

for ii = 1:100000 

    if ii == 1 
     statements_1; 
    elseif ii >= 2 && ii <= 10 
     statements_2; 
    else 
     statements_3; 
    end 
end 

下面的代码运行速度会更快吗?

for ii = 1:100000 

    if ii > 10 
     statements_3; 
    elseif ii >= 2 && ii <= 10 
     statements_2; 
    else 
     statements_1; 
    end 
end 

任何帮助将非常感激

+4

在IF/elseifs,先放置的条件应该是一个链你期望成为最有可能成功的人,第二个条件应该是第二个最有可能成功的条件,等等。 – Patashu

+0

为防万一您没有意识到这一点,请查看定时功能的'tick'和'tock'命令。它们对于优化非常有用! MATLAB也有一个很好的分析器,但这在这里没有多大帮助。 – chessofnerd

+3

@chessofnerd'tic'和'toc',no'k'。 –

回答

4

是的,它会检查的首要条件拳头,然后如果是假的,它会检查以下条件。

然而,为了提高性能,我建议你使用更量化代码:

for i=find(condition1(1:10000)) 
    statements1 
end 

for i=find(condition2(1:10000)) 
    statements2 
end 

for i=find(condition3(1:10000)) 
    statements3 
end 

与例如[email protected](i) (i>2 & i<10)

+2

如果'statement3(i)'不是'statement2(j)'或'statement1(k)'的函数,即递归关系,那么这个矢量化版本才真正适合。否则,你需要传递数据来完成这项工作。 – horchler

+0

+1这是一个潜在的非常有用的MATLAB编程模式。 –

+0

我很抱歉,但我相信你的解决方案比原来的单一循环慢得多。原因在于,在现代ML版本中,JITC /加速器能够近似向量化循环,而在您的解决方案中,您重复循环三次,每次在整个向量上使用find(),这在内存分配/ dealloc和CPU。尝试一下,看看自己。 更好的解决方案是完全矢量化循环(即,如果可能的话,删除“for”关键字的使用)。 –

相关问题