Matlab中的分支预测

时间:2013-06-19 05:40:12

标签: matlab branch-prediction

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

if a > 0
   b = b + 1
end

...

b = b + (a > 0)

会加快速度吗?

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

1 个答案:

答案 0 :(得分: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的用途。