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 は私の母国語ではないので、これを行うための MATLABy の方法が他にあれば、提案をお待ちしています。