From: "sam.saffron (Sam Saffron)" Date: 2013-10-03T10:11:50+09:00 Subject: [ruby-core:57624] [ruby-trunk - Feature #8977] String#frozen that takes advantage of the deduping Issue #8977 has been updated by sam.saffron (Sam Saffron). @hedius the request is all about exposing: VALUE rb_fstring(VALUE str) { st_data_t fstr; if (st_lookup(frozen_strings, (st_data_t)str, &fstr)) { str = (VALUE)fstr; } else { str = rb_str_new_frozen(str); RBASIC(str)->flags |= RSTRING_FSTR; st_insert(frozen_strings, str, str); } return str; } the encoding concerns are already handled by st_lookup afaik, as is the gc concern > def test; x = "asasasa"f; x.object_id; end > test => 70185750124120 > undef :test > GC.start > def test; x = "asasasa"f; x.object_id; end > test => 70185736068940 Overall this feature has some parity with Java / .NETs intern, adapted to the world where MRI is not allow you to shift objects around @charlie I like #pooled , #dedup feels a bit odd ... I totally understand the concern about #frozen vs #frozen? it can be confusing ---------------------------------------- Feature #8977: String#frozen that takes advantage of the deduping https://bugs.ruby-lang.org/issues/8977#change-42238 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/