summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-Andre Lafortune <github@marc-andre.ca>2020-12-22 21:29:00 -0500
committerMarc-André Lafortune <github@marc-andre.ca>2020-12-23 01:08:38 -0500
commitdaec109f423e54094800e083fc8a8ca5cbceb866 (patch)
treef78b987b23611916bd7dba30483e51a56fd5f864
parentc5a445d577b786e31c420b5857ad05b954b420ec (diff)
[ruby/psych] Optimize cache with `compare_by_identity`
Using `compare_by_identity` gives a 4x performance boost on cache hits. Benchmark in https://github.com/JuanitoFatas/fast-ruby/issues/189
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3953
-rw-r--r--ext/psych/lib/psych/visitors/visitor.rb2
-rw-r--r--ext/psych/lib/psych/visitors/yaml_tree.rb2
-rw-r--r--test/psych/test_ractor.rb3
3 files changed, 5 insertions, 2 deletions
diff --git a/ext/psych/lib/psych/visitors/visitor.rb b/ext/psych/lib/psych/visitors/visitor.rb
index 35f8f81f184..e2585c0c774 100644
--- a/ext/psych/lib/psych/visitors/visitor.rb
+++ b/ext/psych/lib/psych/visitors/visitor.rb
@@ -12,7 +12,7 @@ module Psych
def self.dispatch_cache
Hash.new do |hash, klass|
hash[klass] = :"visit_#{klass.name.gsub('::', '_')}"
- end
+ end.compare_by_identity
end
if defined?(Ractor)
diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb
index 986c57be703..ac6777aeb5d 100644
--- a/ext/psych/lib/psych/visitors/yaml_tree.rb
+++ b/ext/psych/lib/psych/visitors/yaml_tree.rb
@@ -80,7 +80,7 @@ module Psych
raise(TypeError, "Can't dump #{target.class}") unless method
h[klass] = method
- end
+ end.compare_by_identity
end
def start encoding = Nodes::Stream::UTF8
diff --git a/test/psych/test_ractor.rb b/test/psych/test_ractor.rb
index 90e40360c02..2f8d5ca18de 100644
--- a/test/psych/test_ractor.rb
+++ b/test/psych/test_ractor.rb
@@ -24,6 +24,9 @@ class TestPsychRactor < Test::Unit::TestCase
end
def test_ractor_config
+ # Config is ractor-local
+ # Test is to make sure it works, even though usage is probably very low.
+ # The methods are not documented and might be deprecated one day
assert_ractor(<<~RUBY, require_relative: 'helper')
r = Ractor.new do
Psych.add_builtin_type 'omap' do |type, val|