Skip to content
Snippets Groups Projects
Commit 5c1ef155 authored by Qianqian Fang's avatar Qianqian Fang
Browse files

accelerate fastarrayparser by 200%! jsonlab_speedtest cuts from 11s to 5.8s

parent a47d57aa
No related branches found
No related tags found
No related merge requests found
...@@ -8,9 +8,9 @@ tsave=zeros(len,1); ...@@ -8,9 +8,9 @@ tsave=zeros(len,1);
tload=zeros(len,1); tload=zeros(len,1);
for i=1:len for i=1:len
tic; tic;
json=savebj('data',struct('d1',rand(datalen(i),3),'d2',rand(datalen(i),3)>0.5)); json=savejson('data',struct('d1',rand(datalen(i),3),'d2',rand(datalen(i),3)>0.5));
tsave(i)=toc; tsave(i)=toc;
data=loadbj(json); data=loadjson(json);
tload(i)=toc-tsave(i); tload(i)=toc-tsave(i);
fprintf(1,'matrix size: %d\n',datalen(i)); fprintf(1,'matrix size: %d\n',datalen(i));
end end
......
...@@ -221,10 +221,10 @@ function [object, pos,index_esc] = parse_array(inputstr, pos, esc, index_esc, va ...@@ -221,10 +221,10 @@ function [object, pos,index_esc] = parse_array(inputstr, pos, esc, index_esc, va
% next handle 2D array, these are most common ones % next handle 2D array, these are most common ones
if(maxlevel==2 && ~isempty(regexp(arraystr(2:end),'^\s*\[','once'))) if(maxlevel==2 && ~isempty(regexp(arraystr(2:end),'^\s*\[','once')))
isndarray=nestbracket2dim(arraystr,'[]',1); [dims,isndarray]=nestbracket2dim(arraystr);
rowstart=find(arraystr(2:end)=='[',1)+1; rowstart=find(arraystr(2:end)=='[',1)+1;
if(rowstart && isndarray) if(rowstart && isndarray)
[obj, nextidx]=parse2darray(inputstr,pos+rowstart,arraystr); [obj, nextidx]=parsendarray(arraystr,dims);
if(nextidx>=length(arraystr)-1) if(nextidx>=length(arraystr)-1)
object=obj; object=obj;
if(format>1.9) if(format>1.9)
...@@ -243,17 +243,12 @@ function [object, pos,index_esc] = parse_array(inputstr, pos, esc, index_esc, va ...@@ -243,17 +243,12 @@ function [object, pos,index_esc] = parse_array(inputstr, pos, esc, index_esc, va
% for N-D packed array in a nested array construct, % for N-D packed array in a nested array construct,
% in the future can replace 1d and 2d cases % in the future can replace 1d and 2d cases
if(maxlevel>2 && ~isempty(regexp(arraystr(2:end),'^\s*\[\s*\[','once'))) if(maxlevel>2 && ~isempty(regexp(arraystr(2:end),'^\s*\[\s*\[','once')))
astr=arraystr; [dims,isndarray]=nestbracket2dim(arraystr);
[dims,isndarray]=nestbracket2dim(astr); rowstart=find(arraystr(2:end)=='[',1)+1;
if(isndarray && (any(dims==0) || all(mod(dims(:),1) == 0))) % all dimensions are integers - this can be problematic if(rowstart && isndarray)
astr=arraystr; [obj, nextidx]=parsendarray(arraystr,dims);
astr(astr=='[')=''; if(nextidx>=length(arraystr)-1)
astr(astr==']')=''; object=obj;
astr=regexprep(astr,'\s*,',',');
astr=regexprep(astr,'\s*$','');
[obj, count, errmsg, nextidx]=sscanf(astr,'%f,',inf);
if(nextidx>=length(astr)-1)
object=reshape(obj,dims);
if(format>1.9) if(format>1.9)
object=permute(object,ndims(object):-1:1); object=permute(object,ndims(object):-1:1);
end end
...@@ -544,26 +539,19 @@ function arraystr=sscanf_prep(str) ...@@ -544,26 +539,19 @@ function arraystr=sscanf_prep(str)
arraystr=regexprep(arraystr,'"_NaN_"','NaN'); arraystr=regexprep(arraystr,'"_NaN_"','NaN');
arraystr=regexprep(arraystr,'"([-+]*)_Inf_"','$1Inf'); arraystr=regexprep(arraystr,'"([-+]*)_Inf_"','$1Inf');
end end
arraystr(arraystr==sprintf('\n'))=[]; arraystr(arraystr==sprintf('\n'))=' ';
arraystr(arraystr==sprintf('\r'))=[]; arraystr(arraystr==sprintf('\r'))=' ';
end end
%%------------------------------------------------------------------------- %%-------------------------------------------------------------------------
function [obj, nextidx,nextdim]=parse2darray(inputstr,startpos,arraystr) function [obj, nextidx]=parsendarray(arraystr, dims)
rowend=match_bracket(inputstr,startpos);
rowstr=sscanf_prep(inputstr(startpos-1:rowend));
[vec1, nextdim, errmsg, nextidx]=sscanf(rowstr,'%f,',[1 inf]);
if(nargin==2)
obj=nextdim;
return;
end
astr=arraystr; astr=arraystr;
astr(astr=='[')=' '; astr(astr=='[')=' ';
astr(astr==']')=' '; astr(astr==']')=' ';
astr=regexprep(deblank(astr),'\s+,',','); astr(astr==',')=' ';
[obj, count, errmsg, nextidx]=sscanf(astr,'%f,',inf); [obj, count, errmsg, nextidx]=sscanf(astr,'%f',inf);
if(nextidx>=length(astr)-1) if(nextidx>=length(astr)-1)
obj=reshape(obj,nextdim,numel(obj)/nextdim); obj=reshape(obj,dims);
nextidx=length(arraystr)+1; nextidx=length(arraystr)+1;
end end
end end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment