Feature #12009
closed[PATCH] psych: pre-freeze string keys for hashes
Description
With the following example, this reduces allocations from 346 to 324
strings when calling Psych.load on a 26-entry hash:
require 'psych' require 'objspace' before = {} after = {} str = [ '---', *(('a'..'z').map { |k| "#{k * 11}: 1" }), '' ].join("\n") GC.disable ObjectSpace.count_objects(before) h = Psych.load(str) ObjectSpace.count_objects(after) p(after[:T_STRING] - before[:T_STRING]) Allocating 324 strings for 26 hash keys is still expensive. More
work will be needed to reduce allocations further...
Tested on x86-64.
It would actually be awesome if Psych could use the fstring table
and have string keys auto-deduped as in Ruby source code.
Files
Updated by nobu (Nobuyoshi Nakada) almost 10 years ago
- Description updated (diff)
- Status changed from Open to Assigned
Updated by normalperson (Eric Wong) almost 10 years ago
Alternative patch which is stronger to help the case where I have
arrays of hashes; each hash having the same set of keys:
http://80x24.org/spew/20160120035342.20168-1-e@80x24.org/raw
However, this does not help the case where I have multiple
Psych.load invocations...
Unsubscribe: mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe
http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core