C++ OpenCV速度差平方和

C++ OpenCV速度差平方和,c++,algorithm,computer-vision,C++,Algorithm,Computer Vision,我一直在使用openCV进行一些块匹配,我注意到它的平方差和代码与这样的直接for循环相比非常快: int SSD = 0; for(int i =0; i < arraySize; i++) SSD += (array1[i] - array2[i] )*(array1[i] - array2[i]); intssd=0; for(int i=0;i

我一直在使用openCV进行一些块匹配,我注意到它的平方差和代码与这样的直接for循环相比非常快:

int SSD = 0;
for(int i =0; i < arraySize; i++)
    SSD += (array1[i] - array2[i] )*(array1[i] - array2[i]);
intssd=0;
for(int i=0;i
如果我看一下源代码,看看繁重的工作发生在哪里 OpenCV人员让他们的for循环在循环的每次迭代中一次进行4次平方差计算。执行块匹配的函数如下所示

int64
icvCmpBlocksL2_8u_C1( const uchar * vec1, const uchar * vec2, int len )
{
int i, s = 0;
int64 sum = 0;

for( i = 0; i <= len - 4; i += 4 ) 
{   
    int v = vec1[i] - vec2[i];
    int e = v * v;

    v = vec1[i + 1] - vec2[i + 1]; 
    e += v * v;
    v = vec1[i + 2] - vec2[i + 2];
    e += v * v;
    v = vec1[i + 3] - vec2[i + 3];
    e += v * v;
    sum += e;
}

for( ; i < len; i++ )
{
    int v = vec1[i] - vec2[i];

    s += v * v;
}

return sum + s;
}
int64
icvCmpBlocksL2_8u_C1(常数*向量1,常数*向量2,整数长度)
{
int i,s=0;
int64总和=0;

对于(i=0;i我的猜测是,这只是一个简单的实现-它在循环的每个过程中节省了3次添加和3次比较,例如,如果检查
len
涉及缓存未命中,这将是一个巨大的节约。缺点是这种优化增加了代码复杂性(例如,如果长度不能被4平均整除,则在末尾附加for循环以完成len%4项的循环),当然,这是一种依赖于体系结构的优化,其改进幅度将因硬件/编译器等而异


尽管如此,与大多数优化相比,它很容易遵循,并且无论架构如何,都可能会导致某种性能的提高,因此,将其投入其中并希望达到最佳效果的风险很低。由于OpenCV是一个受良好支持的代码块,我确信有人对这些代码块进行了检测,并且正如您自己所做的那样,您的代码有一个明显的优化,即:

int SSD = 0;
for(int i = 0; i < arraySize; i++)
{
    int v = array1[i] - array2[i];
    SSD += v * v;
}
intssd=0;
for(int i=0;i
我对优化我的代码有点陌生。为什么将平方差计算分成两行会带来速度优势?还有,l和c在做什么?@ncRubert重点不是打破平方差计算,而是不计算2倍的差
array1[I]-array2[I]
int SSD = 0;
for(int i = 0; i < arraySize; i++)
{
    int v = array1[i] - array2[i];
    SSD += v * v;
}