From: "jeremyevans0 (Jeremy Evans)" Date: 2021-10-21T22:56:19+00:00 Subject: [ruby-core:105743] [Ruby master Feature#13715] [PATCH] avoid garbage from Symbol#to_s in interpolation Issue #13715 has been updated by jeremyevans0 (Jeremy Evans). I've submitted a pull request for an updated version of @normalperson's patch: https://github.com/ruby/ruby/pull/5002, expanding the optimization to include nil/true/false/0-9. This is an across-the-board performance improvement, mostly by reducing the number of VM instructions from 6 to 1. From the benchmarks included in the patch, performance increase from the patch is roughly: :symbol :: 60% 0-9 :: 50% nil/true/false :: 20% integer :: 10% [] :: 10% "" :: 3% It's definitely adds complexity, and I'm not sure how much of a difference it makes in a production application. However, string interpolation is fairly common in most Ruby applications and libraries, and many interpolations will use symbols/nil/true/false/0-9, so I think it is worthy of consideration. ---------------------------------------- Feature #13715: [PATCH] avoid garbage from Symbol#to_s in interpolation https://bugs.ruby-lang.org/issues/13715#change-94246 * Author: normalperson (Eric Wong) * Status: Open * Priority: Normal ---------------------------------------- ~~~ "ruby -e 'p GC.stat(:total_allocated_objects)'" goes from 70199 to 69540 allocated objects when loading RubyGems from a clean install. The increased VM size slows down the whileloop2 and vm2_dstr case slightly, but string interpolation often consists of non-strings. The addition of inline cache helps integer cases slightly, and the intended Symbol optimization gives a major improvement. speedup relative to trunk name |built ---------------|------: loop_whileloop2| 0.984 vm2_dstr* | 0.991 vm2_dstr_digit*| 1.167 vm2_dstr_int* | 1.120 vm2_dstr_nil* | 1.181 vm2_dstr_sym* | 1.663 Digits (0-9), Integers, and perhaps true/false/nil may be optimized in the future. * vm_eval.c (rb_vm_call0_body): new function exports vm_call0_body * vm_insnshelper.c (vm_tostring): new function * insns.def (tostring): call vm_tostring with ci + cc * compile.c (iseq_compile_each0): adjust tostring insn compile * benchmark/bm_vm2_dstr_digit.rb: new benchmark * benchmark/bm_vm2_dstr_int.rb: ditto * benchmark/bm_vm2_dstr_nil.rb: ditto * benchmark/bm_vm2_dstr_sym.rb: ditto ~~~ ---Files-------------------------------- 0001-avoid-garbage-from-Symbol-to_s-in-interpolation.patch (6.32 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: