У меня есть долго работающая функция в 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, чтобы это знать.
Edited ...
Как правильно заметил Гаутам, в исходном коде была ошибка, которая игнорировала результаты рекурсии. Это то, что делает настоящий код. Я уверен, что это очевидно, но MATLAB - не мой родной язык, поэтому, если есть более MATLABы способ сделать это, я бы с удовольствием порекомендовал.