1

Matlab 是否使用分支预测来提高性能?也就是说,如果我们像这样扁平化 if 语句:

if a > 0
   b = b + 1
end

...

b = b + (a > 0)

它会加快速度吗?

PS:我确实理解这个具体的例子可能永远不会用任何语言加速事情,但想象一些更复杂的事情,即嵌套 if 或多个具有多个条件的 else 语句......

4

1 回答 1

4

当然,如果你有类似的东西

if a > 0
   b = b + <outcome of some super time consuming calculation>
end

...

b = b + (a > 0) * <outcome of some super time consuming calculation>

第一个案例将胜出。显然,这就是您应该如何构建代码的方式。

但是对于像您建议的那种更简单的情况,找出答案的唯一方法是分析。

clc

N = 1e2;


tend = 0;
for ii = 1:N
    tstart = tic;
    b = 0;
    for jj = 1:1e5
        a = randn;
        if a > 0
            b = b + 1;
        end
    end
    tend = tend + toc(tstart);
end
tend/N


tend = 0;
for ii = 1:N
    tstart = tic;
    b = 0;
    for jj = 1:1e5
        a = randn;
        b = b + (a > 0);
    end

    tend = tend + toc(tstart);
end
tend/N

第一次运行:

ans =
    1.000391000000000e-02
ans =
    5.645930000000001e-03

第二次运行:

ans =
    5.761880000000000e-03
ans =
    5.599670000000002e-03

第三轮:

ans =
     6.127599999999998e-03
ans =
     5.800120000000002e-03

等等。

所以是的,由于分支似乎确实存在性能损失,尽管我们不能确定它实际上是由于分支预测怪癖或 MATLAB 的解释器/JIT 对if-else构造做了一些奇怪的事情......

与往常一样,如果您想要性能和细粒度控制,请不要使用 MATLAB,使用 C。这种事情根本不是 MATLAB 的用途。

于 2013-06-19T06:32:21.753 回答