Skip to content

Commit 5ae51f1

Browse files
committed
replacing string concatenation by str cells to gain 2x speed in savejson
1 parent 7dd018b commit 5ae51f1

File tree

2 files changed

+45
-40
lines changed

2 files changed

+45
-40
lines changed

savejson.m

Lines changed: 42 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,13 @@
150150
end
151151

152152
% save to a file if FileName is set, suggested by Patrick Rapin
153-
if(~isempty(jsonopt('FileName','',opt)))
153+
filename=jsonopt('FileName','',opt);
154+
if(~isempty(filename))
154155
if(jsonopt('SaveBinary',0,opt)==1)
155-
fid = fopen(opt.filename, 'wb');
156+
fid = fopen(filename, 'wb');
156157
fwrite(fid,json);
157158
else
158-
fid = fopen(opt.filename, 'wt');
159+
fid = fopen(filename, 'wt');
159160
fwrite(fid,json,'char');
160161
end
161162
fclose(fid);
@@ -178,7 +179,7 @@
178179

179180
%%-------------------------------------------------------------------------
180181
function txt=cell2json(name,item,level,varargin)
181-
txt='';
182+
txt={};
182183
if(~iscell(item))
183184
error('input is not a cell');
184185
end
@@ -196,42 +197,43 @@
196197
bracketlevel=~jsonopt('singletcell',1,varargin{:});
197198
if(len>bracketlevel)
198199
if(~isempty(name))
199-
txt=sprintf('%s"%s": [%s',padding0, checkname(name,varargin{:}),nl); name='';
200+
txt={padding0, '"', checkname(name,varargin{:}),'": [', nl}; name='';
200201
else
201-
txt=sprintf('%s[%s',padding0,nl);
202+
txt={padding0, '[', nl};
202203
end
203204
elseif(len==0)
204205
if(~isempty(name))
205-
txt=sprintf('%s"%s": []',padding0, checkname(name,varargin{:})); name='';
206+
txt={padding0, '"' checkname(name,varargin{:}) '": []'}; name='';
206207
else
207-
txt=sprintf('%s[]',padding0);
208+
txt={padding0, '[]'};
208209
end
209210
end
210211
for i=1:dim(1)
211212
if(dim(1)>1)
212-
txt=sprintf('%s%s[%s',txt,padding2,nl);
213+
txt(end+1:end+3)={padding2,'[',nl};
213214
end
214215
for j=1:dim(2)
215-
txt=sprintf('%s%s',txt,obj2json(name,item{i,j},level+(dim(1)>1)+(len>bracketlevel),varargin{:}));
216+
txt{end+1}=obj2json(name,item{i,j},level+(dim(1)>1)+(len>bracketlevel),varargin{:});
216217
if(j<dim(2))
217-
txt=sprintf('%s%s',txt,sprintf(',%s',nl));
218+
txt(end+1:end+2)={',' nl};
218219
end
219220
end
220221
if(dim(1)>1)
221-
txt=sprintf('%s%s%s]',txt,nl,padding2);
222+
txt(end+1:end+3)={nl,padding2,']'};
222223
end
223224
if(i<dim(1))
224-
txt=sprintf('%s%s',txt,sprintf(',%s',nl));
225+
txt(end+1:end+2)={',' nl};
225226
end
226227
%if(j==dim(2)) txt=sprintf('%s%s',txt,sprintf(',%s',nl)); end
227228
end
228229
if(len>bracketlevel)
229-
txt=sprintf('%s%s%s]',txt,nl,padding0);
230+
txt(end+1:end+3)={nl,padding0,']'};
230231
end
232+
txt = sprintf('%s',txt{:});
231233

232234
%%-------------------------------------------------------------------------
233235
function txt=struct2json(name,item,level,varargin)
234-
txt='';
236+
txt={};
235237
if(~isstruct(item))
236238
error('input is not a struct');
237239
end
@@ -251,61 +253,62 @@
251253

252254
if(isempty(item))
253255
if(~isempty(name))
254-
txt=sprintf('%s"%s": []',padding0,checkname(name,varargin{:}));
256+
txt={padding0, '"', checkname(name,varargin{:}),'": []'};
255257
else
256-
txt=sprintf('%s[]',padding0);
258+
txt={padding0, '[]'};
257259
end
258260
return;
259261
end
260262
if(~isempty(name))
261263
if(forcearray)
262-
txt=sprintf('%s"%s": [%s',padding0,checkname(name,varargin{:}),nl);
264+
txt={padding0, '"', checkname(name,varargin{:}),'": [', nl};
263265
end
264266
else
265267
if(forcearray)
266-
txt=sprintf('%s[%s',padding0,nl);
268+
txt={padding0, '[', nl};
267269
end
268270
end
269271
for j=1:dim(2)
270272
if(dim(1)>1)
271-
txt=sprintf('%s%s[%s',txt,padding2,nl);
273+
txt(end+1:end+3)={padding2,'[',nl};
272274
end
273275
for i=1:dim(1)
274276
names = fieldnames(item(i,j));
275277
if(~isempty(name) && len==1 && ~forcearray)
276-
txt=sprintf('%s%s"%s": {%s',txt,padding1, checkname(name,varargin{:}),nl);
278+
txt(end+1:end+5)={padding1, '"', checkname(name,varargin{:}),'": {', nl};
277279
else
278-
txt=sprintf('%s%s{%s',txt,padding1,nl);
280+
txt(end+1:end+3)={padding1, '{', nl};
279281
end
280282
if(~isempty(names))
281283
for e=1:length(names)
282-
txt=sprintf('%s%s',txt,obj2json(names{e},item(i,j).(names{e}),...
283-
level+(dim(1)>1)+1+forcearray,varargin{:}));
284+
txt{end+1}=obj2json(names{e},item(i,j).(names{e}),...
285+
level+(dim(1)>1)+1+forcearray,varargin{:});
284286
if(e<length(names))
285-
txt=sprintf('%s%s',txt,',');
287+
txt{end+1}=',';
286288
end
287-
txt=sprintf('%s%s',txt,nl);
289+
txt{end+1}=nl;
288290
end
289291
end
290-
txt=sprintf('%s%s}',txt,padding1);
292+
txt(end+1:end+2)={padding1,'}'};
291293
if(i<dim(1))
292-
txt=sprintf('%s%s',txt,sprintf(',%s',nl));
294+
txt(end+1:end+2)={',' nl};
293295
end
294296
end
295297
if(dim(1)>1)
296-
txt=sprintf('%s%s%s]',txt,nl,padding2);
298+
txt(end+1:end+3)={nl,padding2,']'};
297299
end
298300
if(j<dim(2))
299-
txt=sprintf('%s%s',txt,sprintf(',%s',nl));
301+
txt(end+1:end+2)={',' nl};
300302
end
301303
end
302304
if(forcearray)
303-
txt=sprintf('%s%s%s]',txt,nl,padding0);
305+
txt(end+1:end+3)={nl,padding0,']'};
304306
end
307+
txt = sprintf('%s',txt{:});
305308

306309
%%-------------------------------------------------------------------------
307310
function txt=str2json(name,item,level,varargin)
308-
txt='';
311+
txt={};
309312
if(~ischar(item))
310313
error('input is not a string');
311314
end
@@ -320,11 +323,11 @@
320323

321324
if(~isempty(name))
322325
if(len>1)
323-
txt=sprintf('%s"%s": [%s',padding1,checkname(name,varargin{:}),nl);
326+
txt={padding1, '"', checkname(name,varargin{:}),'": [', nl};
324327
end
325328
else
326329
if(len>1)
327-
txt=sprintf('%s[%s',padding1,nl);
330+
txt={padding1, '[', nl};
328331
end
329332
end
330333
for e=1:len
@@ -334,18 +337,19 @@
334337
if(isempty(name))
335338
obj=['"',val,'"'];
336339
end
337-
txt=sprintf('%s%s%s%s',txt,padding1,obj);
340+
txt(end+1:end+2)={padding1, obj};
338341
else
339-
txt=sprintf('%s%s%s%s',txt,padding0,['"',val,'"']);
342+
txt(end+1:end+4)={padding0,'"',val,'"'};
340343
end
341344
if(e==len)
342345
sep='';
343346
end
344-
txt=sprintf('%s%s',txt,sep);
347+
txt{end+1}=sep;
345348
end
346349
if(len>1)
347-
txt=sprintf('%s%s%s%s',txt,nl,padding1,']');
350+
txt(end+1:end+3)={nl,padding1,']'};
348351
end
352+
txt = sprintf('%s',txt{:});
349353

350354
%%-------------------------------------------------------------------------
351355
function txt=mat2json(name,item,level,varargin)

saveubjson.m

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,9 @@
125125
end
126126

127127
% save to a file if FileName is set, suggested by Patrick Rapin
128-
if(~isempty(jsonopt('FileName','',opt)))
129-
fid = fopen(opt.filename, 'wb');
128+
filename=jsonopt('FileName','',opt);
129+
if(~isempty(filename))
130+
fid = fopen(filename, 'wb');
130131
fwrite(fid,json);
131132
fclose(fid);
132133
end

0 commit comments

Comments
 (0)