Matlab是否使用分支预测来提高性能?也就是说,如果我们这样陈述if语句:
if a > 0
b = b + 1
end
...
b = b + (a > 0)
会加快速度吗?
PS:我确实理解这个具体的例子可能永远不会以任何语言加速,但想象一些更复杂的东西,即嵌套if或其他多个条件的语句......
答案 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的用途。