From: "sam.saffron (Sam Saffron)" Date: 2013-10-04T15:38:12+09:00 Subject: [ruby-core:57662] [ruby-trunk - Feature #8977] String#frozen that takes advantage of the deduping Issue #8977 has been updated by sam.saffron (Sam Saffron). @nobu You can implement a separate string pool in 2.0 using like so: require 'weakref' class Pool def initialize @pool = {} end def get(str) ref = @pool[str] # GC may run between alive? and __getobj__ copy = ref && ref.weakref_alive? && copy = ref.__getobj__ rescue nil unless copy copy=str.dup ref=WeakRef.new(copy) copy.freeze @pool[str] = ref end copy end def scrub! GC.start @pool.delete_if{|k,v| v.nil?} end def length @pool.length end end @pool = Pool.new def test puts @pool.get("test").object_id end test #69822933011880 test #69822933011880 p @pool.length #1 @pool.scrub! test #69822914568080 test #69822914568080 p @pool.length #1 but the disadvantage is that it is fiddely, requires manual management and will not reuse FrozenTable ---------------------------------------- Feature #8977: String#frozen that takes advantage of the deduping https://bugs.ruby-lang.org/issues/8977#change-42280 Author: sam.saffron (Sam Saffron) Status: Open Priority: Normal Assignee: Category: Target version: current: 2.1.0 During memory profiling I noticed that a large amount of string duplication is generated from non pre-determined strings. Take this report for example https://gist.github.com/SamSaffron/6789005 (generated using the memory_profiler gem that works against head) ">=" x 4953 /Users/sam/.rbenv/versions/2.1.0-dev/lib/ruby/2.1.0/rubygems/requirement.rb:93 x 4535 This string is most likely extracted from a version. Or "/Users/sam/.rbenv/versions/2.1.0-dev/lib/ruby/gems" x 5808 /Users/sam/.rbenv/versions/2.1.0-dev/lib/ruby/gems/2.1.0/gems/activesupport-3.2.12/lib/active_support/dependencies.rb:251 x 3894 A string that can not be pre-determined. ---- It would be nice to have "hello,world".split(",")[0].frozen.object_id == "hello"f.object_id Adding #frozen will give library builders a way of using the de-duping. It also could be implemented using weak refs in 2.0 and stubbed with a .dup.freeze in 1.9.3 . Thoughts ? -- http://bugs.ruby-lang.org/