Actions
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
Actions
Like0
Like0Like0Like0