[前][次][番号順一覧][スレッド一覧]

ruby-changes:22034

From: nahi <ko1@a...>
Date: Tue, 20 Dec 2011 23:56:18 +0900 (JST)
Subject: [ruby-changes:22034] nahi:r34083 (trunk): * PStore content update perf optimization. Patch by Masaki Matsushita.

nahi	2011-12-20 23:56:07 +0900 (Tue, 20 Dec 2011)

  New Revision: 34083

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34083

  Log:
    * PStore content update perf optimization. Patch by Masaki Matsushita.
      See #5248.
    
    * lib/pstore.rb (save_data):
    
      * Delete inadequate Marshal check.
    
      * Deferred file truncation: when writing the new content, truncate
        the saved file to the data size after writing the data, instead of
        truncating whole bytes before writing data.
    
      * Deferred MD5 calculation: when comparing MD5 hash to check the
        content modification, calculate MD5 hash of new data iif the
        content length is differ from the old one.
    
      * Compare content size with String#bytesize instead of String#size.

  Modified files:
    trunk/ChangeLog
    trunk/lib/pstore.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34082)
+++ ChangeLog	(revision 34083)
@@ -1,3 +1,22 @@
+Tue Dec 20 23:50:12 2011  Hiroshi Nakamura  <nahi@r...>
+
+	* PStore content update perf optimization. Patch by Masaki Matsushita.
+	  See #5248.
+
+	* lib/pstore.rb (save_data):
+
+	  * Delete inadequate Marshal check.
+
+	  * Deferred file truncation: when writing the new content, truncate
+	    the saved file to the data size after writing the data, instead of
+	    truncating whole bytes before writing data.
+
+	  * Deferred MD5 calculation: when comparing MD5 hash to check the
+	    content modification, calculate MD5 hash of new data iif the
+	    content length is differ from the old one.
+
+	  * Compare content size with String#bytesize instead of String#size.
+
 Tue Dec 20 21:00:30 2011  Tadayoshi Funaba  <tadf@d...>
 
 	* ext/date/date_core.c: uses to_integer instead.
Index: lib/pstore.rb
===================================================================
--- lib/pstore.rb	(revision 34082)
+++ lib/pstore.rb	(revision 34083)
@@ -402,11 +402,11 @@
         # This seems to be a newly-created file.
         table = {}
         checksum = empty_marshal_checksum
-        size = empty_marshal_data.size
+        size = empty_marshal_data.bytesize
       else
         table = load(data)
         checksum = Digest::MD5.digest(data)
-        size = data.size
+        size = data.bytesize
         if !table.is_a?(Hash)
           raise Error, "PStore file seems to be corrupted."
         end
@@ -427,34 +427,10 @@
     is_windows
   end
 
-  # Check whether Marshal.dump supports the 'canonical' option. This option
-  # makes sure that Marshal.dump always dumps data structures in the same order.
-  # This is important because otherwise, the checksums that we generate may differ.
-  def marshal_dump_supports_canonical_option?
-    begin
-      Marshal.dump(nil, -1, true)
-      result = true
-    rescue
-      result = false
-    end
-    self.class.instance_method(:marshal_dump_supports_canonical_option?)
-    self.class.__send__(:define_method, :marshal_dump_supports_canonical_option?) do
-      result
-    end
-    result
-  end
-
   def save_data(original_checksum, original_file_size, file)
-    # We only want to save the new data if the size or checksum has changed.
-    # This results in less filesystem calls, which is good for performance.
-    if marshal_dump_supports_canonical_option?
-      new_data = Marshal.dump(@table, -1, true)
-    else
-      new_data = dump(@table)
-    end
-    new_checksum = Digest::MD5.digest(new_data)
+    new_data = dump(@table)
 
-    if new_data.size != original_file_size || new_checksum != original_checksum
+    if new_data.bytesize != original_file_size || Digest::MD5.digest(new_data) != original_checksum
       if @ultra_safe && !on_windows?
         # Windows doesn't support atomic file renames.
         save_data_with_atomic_file_rename_strategy(new_data, file)
@@ -484,8 +460,8 @@
 
   def save_data_with_fast_strategy(data, file)
     file.rewind
-    file.truncate(0)
     file.write(data)
+    file.truncate(data.bytesize)
   end
 
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]