Is there a faster way to implement a FIFO (queue) ?

35 次查看(过去 30 天)
Hi, I was wondering if somebody could comment on my use of array indexing. I have a recursive function which uses some initial conditions passed in. I use it in the following manner.
ic = [x_i ic(1:end-1)];
ic is a long vector. x_i is a double.
This line seems to be taking a lot of execution time, about 50% of the total time Matlab spends in this function (using Profiler). The rest of the code is set of vectorized computations; I believe they are as fast as they can be.
I made one small adjustment and it made it a bit faster.
ic(2:end) = ic(1:end-1);
ic(1) = x_i;
This improved the execution time and these two lines take 40% of the total execution time of the function.
Could anybody suggest any better way of implementing this FIFO array.
Thanks for your time and comments.
  1 个评论
Brian Harris
Brian Harris 2022-4-12
编辑:Brian Harris 2022-4-12
See this answer: Fast FIFO Array. The circleshift one (which is really just to realign the last answer) is fast because its just a moving pointer "ic=mod(i,Nmax+i)" so doens't move anything. Its really just a circular buffer.

请先登录,再进行评论。

回答(1 个)

Bruno Luong
Bruno Luong 2022-4-12
编辑:Bruno Luong 2022-4-12
If you don't need to retreive the whole FIFO in order, but read and write element by element, then the best way is NOT rearrange the FIFO buffer
FIFO=nan(1,1000);
n = length(FIFO);
nbreadwrte = 1e6;
% Use index to mark place of the oldest element
tic
for i=1:nbreadwrte
% readcell
oldout = FIFO(mod(i-1,n)+1);
newin = rand(1);
% write, recent MATLAB do inplace change of internal data
FIFO(mod(i-1,n)+1) = newin;
end
toc
Elapsed time is 0.125412 seconds.
tic
for i=1:nbreadwrte
% readcell
oldout = FIFO(1);
newin = rand(1);
% write
FIFO = [newin FIFO(1:end-1)];
end
toc
Elapsed time is 1.157002 seconds.
for i=1:nbreadwrte
% readcell
oldout = FIFO(1);
newin = rand(1);
% write
FIFO(2:end) = FIFO(1:end-1);
FIFO(1) = newin;
end
toc
Elapsed time is 2.945253 seconds.

类别

Help CenterFile Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息

标签

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by