 ===================================================================
 --- src/systems/system_io.C	(revision 6270)
 +++ src/systems/system_io.C	(working copy)
-@@ -665,10 +665,15 @@
+@@ -475,6 +475,10 @@
+    * ASCII output.  Thus this one section of code will read XDR or ASCII
+    * files with no changes.
+    */
++  PerfLog pl("IO Performance",false);
++  pl.push("read_parallel_data");
++  unsigned int total_read_size = 0;
++  
+   libmesh_assert (io.reading());
+   libmesh_assert (io.is_open());
+ 
+@@ -514,6 +518,8 @@
+   // for the ith system to disk
+   io.data(io_buffer);
+ 
++  total_read_size += io_buffer.size();
++
+   const unsigned int sys_num = this->number();
+   const unsigned int n_vars  = this->_written_var_indices.size();
+   libmesh_assert_less_equal (n_vars, this->n_vars());
+@@ -590,6 +596,8 @@
+ 	  // for the ith system to disk
+ 	  io.data(io_buffer);
+ 
++	  total_read_size += io_buffer.size();
++
+ 	  // Loop over each non-SCALAR variable and each node, and read out the value.
+           for (unsigned int data_var=0; data_var<n_vars; data_var++)
+             {
+@@ -644,6 +652,16 @@
+           pos->second->close();
+ 	}
+     }
++
++  const Real 
++    dt   = pl.get_elapsed_time(),
++    rate = total_read_size*sizeof(Number)/dt; 
++
++  std::cerr << "Read " << total_read_size << " \"Number\" values\n"
++	    << " Elapsed time = " << dt << '\n'
++	    << " Rate = " << rate/1.e6 << "(MB/sec)\n\n";
++
++  pl.pop("read_parallel_data");
+ }
+ 
+ 
+@@ -665,10 +683,15 @@
    parallel_only();
    std::string comment;
  

 
 	  // set up the comment
 	  if (libMesh::processor_id() == 0)
@@ -1632,6 +1656,16 @@
 	    }
 	}
     }

+        // equation_systems.write (argv[1],   libMeshEnums::WRITE);
+	std::cout << "Binary\n";
+        equation_systems.write ("foo.xdr", libMeshEnums::ENCODE,
+				(EquationSystems::WRITE_PARALLEL_FILES |
+				 EquationSystems::WRITE_DATA |
+				 EquationSystems::WRITE_ADDITIONAL_DATA));
         
         // Clear the equation systems data structure.
