Project

General

Profile

Actions

Bug #9159

closed

[patch] use rb_fstring for internal strings

Bug #9159: [patch] use rb_fstring for internal strings

Added by tmm1 (Aman Karmani) almost 12 years ago. Updated almost 12 years ago.

Status:
Closed
Assignee:
-
Target version:
ruby -v:
ruby 2.1.0dev (2013-11-26 trunk 43852)
[ruby-core:58599]

Description

I added rb_fstring wrappers around internal strings generated by iseqs, regexps and eval:

https://github.com/tmm1/ruby/commit/9587fae171835ccf013661ba837f097754f170ef

In our rails app, this reduces the number of long-lived strings on the heap by 30%.

  $ ruby -rconfig/environment -e' GC.start; p ObjectSpace.count_objects[:T_STRING] '
  246100

  $ ruby -rconfig/environment -e' GC.start; p ObjectSpace.count_objects[:T_STRING] '
  173956

If this patch is acceptable, I can commit it. make test and test-all pass.


Related issues 1 (0 open1 closed)

Related to Ruby - Bug #8148: [patch] reduce allocations due to __FILE__ and {class,module}_evalRejectedtmm1 (Aman Karmani)Actions

Updated by tmm1 (Aman Karmani) almost 12 years ago Actions #1 [ruby-core:58600]

One example of strings de-duplicated by this patch are iseq labels. Before:

irb(main):001:0> mm = "method_missing"
irb(main):002:0> GC.start; ObjectSpace.each_object(String).select{ |o| o == mm }.size
=> 77

After:

irb(main):002:0> GC.start; ObjectSpace.each_object(String).select{ |o| o == mm }.size
=> 3

Updated by tmm1 (Aman Karmani) almost 12 years ago Actions #2 [ruby-core:58601]

if (nd_type(node) == NODE_STR) {

  • hide_obj(node->nd_lit);
    
  • node->nd_lit = rb_fstring(node->nd_lit);
    ADD_INSN1(ret, nd_line(node), putobject, node->nd_lit);
    

Some internal strings are no longer hidden with this patch, since the underlying T_STRING object can be shared via the fstr table.
Since the object is already marked immutable (via the frozen flag), hiding it is unnecessary.

Updated by tmm1 (Aman Karmani) almost 12 years ago Actions #4

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r43866.
Aman, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • compile.c: Use rb_fstring() to de-duplicate string literals in code. [ruby-core:58599] [Bug #9159] [ruby-core:54405]
  • iseq.c (prepare_iseq_build): De-duplicate iseq labels and source locations.
  • re.c (rb_reg_initialize): Use rb_fstring() for regex string.
  • string.c (rb_fstring): Handle non-string and already-fstr arguments.
  • vm_eval.c (eval_string_with_cref): De-duplicate eval source filename.

Updated by normalperson (Eric Wong) almost 12 years ago Actions #5 [ruby-core:58614]

Can somebody following this thread check out my patch for
https://bugs.ruby-lang.org/issues/8998

Theoretically it should be better than nothing (but not ideal), but I
don't think any of my code uses string hash keys enough to matter...
Thanks.

Actions

Also available in: PDF Atom