对于通过阵列的简单循环,内存访问速度非常慢

时间:2011-07-25 22:11:55

标签: iphone objective-c arrays performance

我花了大约50倍的时间来完成一个简单的任务。我的第一反应是我在阵列中扰乱了我的内存访问,导致缓存未命中。但是,情况似乎并非如此。

分配和更新数组的像素值需要一只狗的年龄。你们中的任何一个人都倾向于为什么会这样吗? (我正在编写带有A4的iPod)

memset(columnSumsCurrentFrameA, 0, sizeof(unsigned int) * (_validImageWidth/numSubdivisions) );
memset(rowSumsCurrentFrameA, 0, sizeof(unsigned int) * (_validImageHeight/numSubdivisions) );

int pixelValue = 0;
int startingRow = 0;
int startingColumn = 0;

for (int i = 0; i < _validImageHeight/numSubdivisions; i++)
{
    int index = (i + startingRow) * _imageWidth;
    for( int j = 0; j < (_validImageWidth/numSubdivisions); j++)
    {
        pixelValue = imageData[index + startingColumn + j];
        columnSumsCurrentFrameA[j] += pixelValue;           
        rowSumsCurrentFrameA[i] += pixelValue;              
    }
}

1 个答案:

答案 0 :(得分:0)

_validImageWidth/numSubdivisions的结果必须是整数,你确定总是这样吗?

此外,您应该在进入双循环之前计算_validImageWidth/numSubdivisions,假设您的编译器负责它是不安全的。

int limit = _validImageHeight/numSubdivisions;

for (int i = 0; i < limit; i++)
{
        int index = (i + startingRow) * _imageWidth;
        for( int j = 0; j < limit; j++)
        {
            pixelValue = imageData[index + startingColumn + j];
            columnSumsCurrentFrameA[j] += pixelValue;           
            rowSumsCurrentFrameA[i] += pixelValue;              
        }
}