MATLAB Answers

vectorised code is terribly slower

3 views (last 30 days)
Michal Kvasnicka
Michal Kvasnicka on 9 Sep 2019
Why is the vectorized version of simple local maxima detection code significantly slower (~2-3 times) than its for-loop version?
%ntest data
X = rand(100000,1000);
% findig local maxima over columns of X
% for-loop version
tic;
[I,J] = size(X);
Ind = false(I,J);
for j = 1:J
Ind(:,j) = diff( sign( diff([0; X(:,j); 0]) ) ) < 0;
end
toc
% vectorized version (~3 times slower than for-loop)
tic;
Ind_ = diff(sign(diff([zeros(1,J);X;zeros(1,J)],1,1)),1,1) < 0;
toc
% result identity test
isequal(Ind,Ind_)

  6 Comments

Show 3 older comments
Michal Kvasnicka
Michal Kvasnicka on 9 Sep 2019
I guess, that In this case I call diff(array(:,j),1,1), where array(:,j) is a vector not matrix, so diff in this case does not perform computing over separated columns of array. May be the diff built-in function does not use multithreading properly in this case? But you are right the memory allocation in vectorized code could be really one (!) of slowness cause.
Bruno Luong
Bruno Luong on 9 Sep 2019
It is possibly that the DIFF implementation on array does not access sequently memory in case of 2D array data, but row-by-row of the array, that might slow down.
I don't think the multi-threading is wrongly implemented.
Michal Kvasnicka
Michal Kvasnicka on 9 Sep 2019
The main problem is, that during continuous development of JIT engine are alwyas changing MATLAB performance characteristics for vectorized codes. In general, the standard for-loop codes becomes faster and faster.
I have plenty of highly vectorized MATLAB codes created during last 10 years, which are during last few years becomes slower than theirs for-loop counter parts. So, there is no code performance stability.

Sign in to comment.

Answers (0)

Tags


Translated by