# HG changeset patch # User John W. Eaton # Date 1242401510 14400 # Node ID a542fc1581759f1893ce83b60fabd35756da49e2 # Parent 4b2147b25e8d2a0c7de6a6a9716e63258afb9be0 improve performance of saving large structs in MAT file format diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2009-05-15 John W. Eaton + + * ls-mat5.cc (save_mat5_binary_element): Avoid multiple calls to + contents method. From David Bateman . + (save_mat5_element_length): Use const Cell to avoid making copies + when indexing. + 2009-05-15 Jaroslav Hajek * oct-stream.cc: Don't instantiate Array2. diff --git a/src/ls-mat5.cc b/src/ls-mat5.cc --- 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 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);