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);