【问题标题】:MATLAB: Does the If Statement order affect performanceMATLAB:If 语句顺序是否影响性能
【发布时间】:2013-06-13 01:31:30
【问题描述】:

我正在尝试加快运行大约 100000 次迭代的循环,并且想知道 if 语句的顺序是否对性能有影响。例如,下面的代码会在每次通过 for 循环时在执行 else 中的语句之前检查 if 和 elseif 吗?

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

任何帮助将不胜感激

【问题讨论】:

  • 在 if/elseifs 链中,放在第一位的条件应该是您期望最有可能成功的条件,放在第二位的条件应该是第二个最有可能成功的条件,因此开。
  • 如果您不知道,请查看ticktock 命令的计时功能。它们对于优化非常有用! MATLAB 也有一个很棒的分析器,但在这里没有多大帮助。
  • @chessofnerd tictoc,没有“k”。

标签: performance matlab if-statement for-loop


【解决方案1】:

是的,它会检查第一个条件拳头,如果为假,它会检查以下条件。

但是,为了提高性能,我建议您使用更加矢量化的代码:

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

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

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

例如condition2=@(i) (i&gt;2 &amp; i&lt;10)

【讨论】:

  • 只有当statement3(i) 不是statement2(j)statement1(k) 的函数(即递归关系)时,该矢量化版本才真正适合。否则,您将需要传递数据才能使其正常工作。
  • +1 这对于 MATLAB 来说可能是非常有用的编程模式。
  • 很抱歉,但我相信您的解决方案比原来的单循环慢得多。原因是在现代 ML 版本中,JITC/加速器几乎可以对循环进行矢量化,而在您的解决方案中,您重复循环三次,每次在整个向量上使用 find(),这在内存分配/释放和 CPU。试试看,自己看看。如果可能的话,更好的解决方案是完全矢量化循环(即,删除for 关键字的使用)。
  • @YairAltman,当然,完全矢量化始终是 matlab 中更快的解决方案。但问题是关于执行可能可或不可矢量化的通用代码。在我的回答中,与语句的执行相比,在几乎所有情况下 find() 的成本都应该非常小。如果语句非常非常简单,确实应该首选另一种解决方案。
  • @Oli - 我很清楚这一点。尽管如此,find() 方法的效率通常低于循环。考虑以下代码: tic a = [0,0,0];对于 idx = 1 : 1e7 如果 mod(idx,17)==0 a(1) = a(1) + 1; elseif mod(idx,23)==0 a(2) = a(2) + 1;否则 a(3) = a(3) + 1; end end toc tic a = [0,0,0];对于 idx = find(mod(range,17)==0); a(1) = a(1) + 1; idx 结束 = find(mod(range,23)==0); a(2) = a(2) + 1; end for idx = find(mod(range,17)~=0 & mod(range,23)~=0); a(3) = a(3) + 1;结束目录
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 1970-01-01
  • 2012-10-05
相关资源
最近更新 更多