Issue #9188 has been updated by tmm1 (Aman Gupta).


There were some minor improvements to rb_fstring() recently, but the hash changes are still slow on trunk.
In my environment:

# trunk
./miniruby -I. benchmark/bm_so_k_nucleotide.rb > /dev/null  3.72s user 0.03s system 99% cpu 3.757 total
./miniruby -I. benchmark/bm_so_k_nucleotide.rb > /dev/null  3.76s user 0.03s system 99% cpu 3.794 total
./miniruby -I. benchmark/bm_so_k_nucleotide.rb > /dev/null  3.70s user 0.03s system 99% cpu 3.736 total
./miniruby -I. benchmark/bm_so_k_nucleotide.rb > /dev/null  3.78s user 0.03s system 99% cpu 3.817 total

# revert r43870
./miniruby -I. benchmark/bm_so_k_nucleotide.rb > /dev/null  3.50s user 0.02s system 99% cpu 3.528 total
./miniruby -I. benchmark/bm_so_k_nucleotide.rb > /dev/null  3.49s user 0.02s system 99% cpu 3.515 total
./miniruby -I. benchmark/bm_so_k_nucleotide.rb > /dev/null  3.54s user 0.02s system 99% cpu 3.570 total
./miniruby -I. benchmark/bm_so_k_nucleotide.rb > /dev/null  3.52s user 0.02s system 99% cpu 3.546 total

I'm trying to come up with an alternative patch to keep the string literal hash key test passing, but I'm having a hard time with the parser.
The best I can come up with is the following, which works but feels wrong:

@@ -535,7 +535,7 @@ newhash
     for (i = num; i > 0; i -= 2) {
        const VALUE v = TOPN(i - 2);
        const VALUE k = TOPN(i - 1);
-       rb_hash_aset(val, k, v);
+       rb_hash_aset(val, RB_TYPE_P(k, T_STRING) ? rb_fstring(k) : k, v);
     }
     POPN(num);
 }

Ideally, I'd like to replace alternate putstring instructions involved in any newhash instruction with putobject instructions.
Could someone point out the best place in the compiler to do this?
----------------------------------------
misc #9188: r43870 make benchmark/bm_so_k_nucleotide.rb slow
https://bugs.ruby-lang.org/issues/9188#change-43481

Author: authorNari (Narihiro Nakamura)
Status: Open
Priority: Normal
Assignee: tmm1 (Aman Gupta)
Category: core
Target version: current: 2.1.0


Hi.

I think r43870 make benchmark/bm_so_k_nucleotide.rb slow.

r43870
% time ./miniruby ./benchmark/bm_so_k_nucleotide.rb
./miniruby ./benchmark/bm_so_k_nucleotide.rb  1.70s user 0.01s system 99% cpu 1.718 total

r43869
% time ./miniruby ./benchmark/bm_so_k_nucleotide.rb
./miniruby ./benchmark/bm_so_k_nucleotide.rb  1.52s user 0.03s system 99% cpu 1.559 total


-- 
http://bugs.ruby-lang.org/