我在 MATLAB 中有一个长时间运行的函数,我试图通过添加缓存来加速它并最终显着降低了我的性能。我的代码基本上是在边缘检测图像中搜索连续的“水平”线,原始代码如下所示:
function lineLength = getLineLength(img, startRow, startCol)
[nRows, nCols] = size(img);
lineLength = 0;
if startRow < 1 || startRow > nRows
return;
end
for curCol = startCol:nCols
if img(curCol)
lineLength = lineLength + 1;
continue;
elseif lineLength > 0
lengths = zeros(2,1);
lengths(1) = getLineLength(img, startRow - 1, curCol);
lengths(2) = getLineLength(img, startRow + 1, curCol);
increment = max(lengths);
lineLength = lineLength + increment;
end
break; %// At this point the end of the current line has been reached
end
end function
由于这个函数的性能不是我想要的,我想我会从任何一点添加长度缓存,如下所示:
function lineLength = getLineLength(img, startRow, startCol)
persistent pointCache;
if startRow == 0 && startCol == 0
pointCache = zeros(size(img, 1), size(img, 2), 2);
end
[nRows, nCols] = size(img);
lineLength = 0;
if startRow < 1 || startRow > nRows
return;
end
for curCol = startCol:nCols
if pointCache(startRow, curCol, 2)
lineLength = lineLength + pointCache(startRow, curCol, 1);
break;
end
if img(curCol)
lineLength = lineLength + 1;
continue;
elseif lineLength > 0
lengths = zeros(2,1);
lengths(1) = getLineLength(img, startRow - 1, curCol);
lengths(2) = getLineLength(img, startRow + 1, curCol);
increment = max(lengths);
lineLength = lineLength + increment;
end
break; %// At this point the end of the current line has been reached
end
pointCache(startRow, startCol, 1) = lineLength;
pointCache(startRow, startCol, 2) = 1;
end function
令我惊讶的是,实现这种缓存实际上使我的性能更差,而不是更好。我最好的猜测是global
变量给我带来了麻烦,或者它使用了额外的内存,但我没有足够的 MATLAB 经验知道。
已编辑...
正如 Gautam 正确指出的那样,原始代码中存在一个忽略递归结果的错误。这就是实际代码的作用。我确信这很明显,但 MATLAB 不是我的母语,所以如果有更 MATLAB 的方式来做到这一点,我会喜欢这些建议。