Mercurial > hg > octave-lyh
changeset 9203:a542fc158175
improve performance of saving large structs in MAT file format
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 15 May 2009 11:31:50 -0400 |
parents | 4b2147b25e8d |
children | 1f47a9404d93 |
files | src/ChangeLog src/ls-mat5.cc |
diffstat | 2 files changed, 16 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2009-05-15 John W. Eaton <jwe@octave.org> + + * ls-mat5.cc (save_mat5_binary_element): Avoid multiple calls to + contents method. From David Bateman <dbateman@free.fr>. + (save_mat5_element_length): Use const Cell to avoid making copies + when indexing. + 2009-05-15 Jaroslav Hajek <highegg@gmail.com> * oct-stream.cc: Don't instantiate Array2<read_fptr>.
--- a/src/ls-mat5.cc +++ b/src/ls-mat5.cc @@ -1838,9 +1838,9 @@ for (Octave_map::const_iterator i = m.begin (); i != m.end (); i++) { - Cell elts = m.contents (i); + const Cell elts = m.contents (i); - ret += 8 + save_mat5_element_length (elts (j), "", + ret += 8 + save_mat5_element_length (elts(j), "", save_as_floats, mat7_format); } } @@ -2218,6 +2218,12 @@ int len = m.numel (); + // Create temporary copy of structure contents to avoid + // multiple calls of the contents method. + std::vector<const octave_value *> elts (nf); + for (octave_idx_type i = 0; i < nf; i++) + elts[i] = m.contents (keys(i)).data (); + for (int j = 0; j < len; j++) { // write the data of each element @@ -2226,9 +2232,7 @@ // of the fields. for (octave_idx_type i = 0; i < nf; i++) { - Cell elts = m.contents (keys(i)); - - bool retval2 = save_mat5_binary_element (os, elts(j), "", + bool retval2 = save_mat5_binary_element (os, elts[i][j], "", mark_as_global, false, save_as_floats);