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