2013-06-19 61 views
1

Matlab是否使用分支预测来提高性能?也就是说,如果我们将这些陈述展示出来:Matlab中的分支预测

if a > 0 
    b = b + 1 
end 

... 

b = b + (a > 0) 

它会加快速度吗?

PS:我不明白,这个具体的例子可能永远不会在任何语言中加快速度,但想象更复杂的东西,即与嵌套,如果公司或多个条件几个else语句...

+2

什么具体问题激励你问这个问题? –

+1

这是一个普遍的问题,我想尽可能地给出答案:)我只是想知道,我用于C++的那些优化原则是否适用于此处以及程度如何。 – sashkello

+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的。

+2

您的第一个陈述*'第一个案件将赢得双手'*,并非总是如此(由于解释)。我的理解是:事前是真实的,但如果重复多次,则耗时的计算在第二种情况下只能进行一次。 – Oleg

+0

@OlegKomarov:我当然假设,对于这两种情况(例如'(a> 0)。* <结果向量>',尽可能以最好的方式实现耗时的计算,在那种情况下,*会*在结果向量中进行无用的计算(最好的情况,与'if'相同,最坏的情况,所有的都被浪费了*)。当然,这些损失并没有超过比较的结果。 –

+0

您是否尝试交换这两个代码块?有时它很重要(我不知道为什么,但确实如此)。 – sashkello