Dear all,<br><br>When I am profiling the performance of reading buffer event in ft_read_event, in around line 710, I see the following code causing a performance neck:<br><br>  for i=1:length(evt)<br>      % convert the field "type" into the Matlab representation<br>
      this_type = type{evt(i).type_type+1};<br>      this_size = wordsize{evt(i).type_type+1} * evt(i).type_numel;<br>      sel = 1:this_size;<br>      if strcmp(this_type, 'char')<br>        event(i).type = char(evt(i).buf(sel));<br>
      else<br>        event(i).type = typecast(evt(i).buf(sel), this_type);<br>      end<br>      .<br>      .<br>      .<br>end<br><br><br>If I understand correctly, what the code is currently doing is to read a maximum of 100 events (the number 100 was obtained from my observation when the code was running) from the buffer and then typcast all of them. Filtering of the event is then done by ft_filter_event. However, event(i) is growing inside a loop and has significant negative impact on performance. The impact is even larger in real-time processing because very often we need to keep polling the event information from the buffer. In most of the case, reading such a large number of event to search for the required event type is not necessary because there is only a handful of states in the experimental paradigm. So I suggest we add a "maxsearch" option to let the user set how many total events they want to read from the buffer to search for the required event:<br>
<br><b>In ft_read_event, after:</b><br><br>flt_mintimestamp = keyval('mintimestamp', varargin);<br>flt_maxtimestamp = keyval('maxtimestamp', varargin);<br>flt_minnumber    = keyval('minnumber', varargin);<br>
flt_maxnumber    = keyval('maxnumber', varargin);<br><br><b>add:</b><br>flt_maxsearch     = keyval('maxsearch',varargin);<br><br><b>then around line 710, before:</b><br><br>  for i=1:length(evt)<br>      % convert the field "type" into the 
Matlab representation<br>      this_type = type{evt(i).type_type+1};<br>     
 this_size = wordsize{evt(i).type_type+1} * evt(i).type_numel;<br>      
sel = 1:this_size;<br>      if strcmp(this_type, 'char')<br>        
event(i).type = char(evt(i).buf(sel));<br>      else<br>        
event(i).type = typecast(evt(i).buf(sel), this_type);<br>      end<br>     
 .<br>
      .<br>
      .<br>
end<br><br><br><b>add:</b><br>if(~isempty(flt_maxsearch))<br>        evt=evt((end-flt_maxsearch+1):end);<br>end<br><br><br>I have done some profiling and it does improve the performance. Hope that helps.<br><br>Best regards,<br>
Teris<br><br><br><br><br><br>
<p>----------------------------------</p>
<p>The aim of this list is to facilitate the discussion between users of the FieldTrip  toolbox, to share experiences and to discuss new ideas for MEG and EEG analysis.</p>
<p>  http://listserv.surfnet.nl/archives/fieldtrip.html</p>
<p>  http://www.ru.nl/fcdonders/fieldtrip/</p>