1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/ruby
tenderlove 2f37847820 Speed up hash literals by duping
This commit replaces the `newhashfromarray` instruction with a `duphash`
instruction.  Instead of allocating a new hash from an array stored in
the Instruction Sequences, store a hash directly in the instruction
sequences and dup it on execution.

== Instruction sequence changes ==

```ruby
code = <<-eorby
  { "foo" => "bar", "baz" => "lol" }
eorby

insns = RubyVM::InstructionSequence.compile(code, __FILE__, nil, 0, frozen_string_literal: true)
puts insns.disasm
```

On Ruby 2.5:

```
== disasm: #<ISeq:<compiled>@test.rb:0 (0,0)-(0,36)>====================
0000 putobject        "foo"
0002 putobject        "bar"
0004 putobject        "baz"
0006 putobject        "lol"
0008 newhash          4
0010 leave
```

Ruby 2.6@r66174 3b6321083a:

```
$ ./ruby test.rb
== disasm: #<ISeq:<compiled>@test.rb:0 (0,0)-(0,36)> (catch: FALSE)
0000 newhashfromarray             2, ["foo", "bar", "baz", "lol"]
0003 leave
```

Ruby 2.6 + This commit:

```
$ ./ruby test.rb
== disasm: #<ISeq:<compiled>@test.rb:0 (0,0)-(0,36)> (catch: FALSE)
0000 duphash                      {"foo"=>"bar", "baz"=>"lol"}
0002 leave
```

== Benchmark Results ==

Compared to 2.5.3:

```
$ make benchmark ITEM=hash_literal_small COMPARE_RUBY=/Users/aaron/.rbenv/versions/2.5.3/bin/ruby
generating known_errors.inc
known_errors.inc unchanged
./revision.h unchanged
/Users/aaron/.rbenv/shims/ruby --disable=gems -rrubygems -I./benchmark/lib ./benchmark/benchmark-driver/exe/benchmark-driver \
	            --executables="compare-ruby::/Users/aaron/.rbenv/versions/2.5.3/bin/ruby -I.ext/common --disable-gem" \
	            --executables="built-ruby::./miniruby -I./lib -I. -I.ext/common  -r./prelude --disable-gem" \
	            $(find ./benchmark -maxdepth 1 -name '*hash_literal_small*.yml' -o -name '*hash_literal_small*.rb' | sort)
Calculating -------------------------------------
                     compare-ruby  built-ruby
 hash_literal_small2        1.498       1.877 i/s -       1.000 times in 0.667581s 0.532656s
 hash_literal_small4        1.197       1.642 i/s -       1.000 times in 0.835375s 0.609160s
 hash_literal_small8        0.620       1.215 i/s -       1.000 times in 1.611638s 0.823090s

Comparison:
              hash_literal_small2
          built-ruby:         1.9 i/s
        compare-ruby:         1.5 i/s - 1.25x  slower

              hash_literal_small4
          built-ruby:         1.6 i/s
        compare-ruby:         1.2 i/s - 1.37x  slower

              hash_literal_small8
          built-ruby:         1.2 i/s
        compare-ruby:         0.6 i/s - 1.96x  slower
```

Compared to r66255

```
$ make benchmark ITEM=hash_literal_small COMPARE_RUBY=/Users/aaron/.rbenv/versions/ruby-trunk/bin/ruby
generating known_errors.inc
known_errors.inc unchanged
./revision.h unchanged
/Users/aaron/.rbenv/shims/ruby --disable=gems -rrubygems -I./benchmark/lib ./benchmark/benchmark-driver/exe/benchmark-driver \
	            --executables="compare-ruby::/Users/aaron/.rbenv/versions/ruby-trunk/bin/ruby -I.ext/common --disable-gem" \
	            --executables="built-ruby::./miniruby -I./lib -I. -I.ext/common  -r./prelude --disable-gem" \
	            $(find ./benchmark -maxdepth 1 -name '*hash_literal_small*.yml' -o -name '*hash_literal_small*.rb' | sort)
Calculating -------------------------------------
                     compare-ruby  built-ruby
 hash_literal_small2        1.567       1.831 i/s -       1.000 times in 0.638056s 0.546039s
 hash_literal_small4        1.298       1.652 i/s -       1.000 times in 0.770214s 0.605182s
 hash_literal_small8        0.873       1.216 i/s -       1.000 times in 1.145304s 0.822047s

Comparison:
              hash_literal_small2
          built-ruby:         1.8 i/s
        compare-ruby:         1.6 i/s - 1.17x  slower

              hash_literal_small4
          built-ruby:         1.7 i/s
        compare-ruby:         1.3 i/s - 1.27x  slower

              hash_literal_small8
          built-ruby:         1.2 i/s
        compare-ruby:         0.9 i/s - 1.39x  slower
```

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66258 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-06 18:28:21 +00:00
..
enc update to Unicode 11.0.0 (main step, not complete yet) 2018-12-05 08:10:24 +00:00
allpairs.rb
beginmainend.rb
bug-11928.rb
bug-13526.rb test/ruby/bug-13526.rb: should wait until all threads are stopped 2017-11-21 00:56:09 +00:00
lbtest.rb
marshaltestlib.rb marshaltestlib.rb: use clean object for exception 2018-04-12 03:40:16 +00:00
sentence.rb
test_alias.rb
test_argf.rb Fix error when Encoding.default_external is Encoding::IBM437 2018-08-09 09:36:03 +00:00
test_arithmetic_sequence.rb enumerator.c: Fix ArithmeticSequence for complex step 2018-09-12 07:35:42 +00:00
test_arity.rb
test_array.rb Fix error message 2018-12-04 09:16:49 +00:00
test_assignment.rb Enable the assertions that had been disabled for historical reason 2018-04-17 08:26:20 +00:00
test_ast.rb Refine RubyVM::AbstractSyntaxTree::Node#type 2018-12-03 01:06:34 +00:00
test_autoload.rb try to remove some test skips for MJIT 2018-10-21 15:54:50 +00:00
test_backtrace.rb Revert "Add test for cause on pty" 2018-10-28 17:03:36 +00:00
test_basicinstructions.rb Remove the old disabled assertions for 1.8/1.9 2018-04-17 08:47:56 +00:00
test_beginendblock.rb
test_bignum.rb use Queue for inter-thread synchronization. 2018-04-04 05:00:52 +00:00
test_call.rb
test_case.rb
test_class.rb Add FrozenError as a subclass of RuntimeError 2017-12-12 00:46:34 +00:00
test_clone.rb Don't copy FL_USER* on Kernel#clone. [Bug #14847] 2018-07-09 08:07:26 +00:00
test_comparable.rb
test_complex.rb complex.c: small optimization of Complex#** 2018-10-20 02:49:18 +00:00
test_complex2.rb
test_complexrational.rb
test_condition.rb
test_const.rb
test_continuation.rb Give up support for cross-callcc set_trace_func. 2018-11-26 19:59:08 +00:00
test_default_gems.rb Fixed wrong variable name. 2018-06-02 13:55:54 +00:00
test_defined.rb defined? returns nil for toplevel constant lookup 2018-01-27 06:12:09 +00:00
test_dir.rb Fix r65926 test_dir.rb for windows (tilde) 2018-11-24 00:55:26 +00:00
test_dir_m17n.rb
test_econv.rb
test_encoding.rb
test_enum.rb introduce TransientHeap. [Bug #14858] 2018-10-30 21:53:56 +00:00
test_enumerator.rb Implement Enumerator#+ and Enumerable#chain [Feature #15144] 2018-11-24 08:38:35 +00:00
test_env.rb Removed Windows version condition 2018-10-01 07:50:08 +00:00
test_eval.rb Remove the old disabled assertions for 1.8/1.9 2018-04-17 08:47:56 +00:00
test_exception.rb Don't set throw data as cause [Bug #15282] 2018-11-05 23:06:50 +00:00
test_fiber.rb Avoid GCing dead stack after switching away from a fiber 2018-12-01 03:49:52 +00:00
test_file.rb file.c: realpath on special symlink 2018-02-28 05:43:53 +00:00
test_file_exhaustive.rb Document File.{setuid?,setgid?,sticky?} support for IO objects [Bug #13972] 2018-10-20 11:47:45 +00:00
test_fixnum.rb
test_flip.rb Remove warnings of flip-flop deprecation from tests and specs 2018-06-15 08:53:16 +00:00
test_float.rb object.c: raise on long invalid float string 2018-05-04 06:12:12 +00:00
test_fnmatch.rb
test_gc.rb
test_hash.rb clear dst Hash on Hash#replace. [Bug #15358] 2018-11-29 08:03:55 +00:00
test_ifunless.rb Rename test classes to allow stable test count when running test-all -j 2018-03-13 06:29:02 +00:00
test_integer.rb Fix Rational of Float 2018-10-02 16:42:21 +00:00
test_integer_comb.rb Integer#allbits?, Integer#anybits?, Integer#nobits? [Feature #12753] 2017-12-12 09:12:14 +00:00
test_io.rb test/ruby/test_io.rb (test_recycled_fd_close): remove hacks 2018-11-30 11:44:21 +00:00
test_io_m17n.rb trick ruby-mode.el by heredocs 2018-01-31 04:02:17 +00:00
test_iseq.rb Return same ISeq object for one src. 2018-12-06 10:52:27 +00:00
test_iterator.rb compile.c: try to convert in massign for 2018-01-27 10:41:43 +00:00
test_jit.rb Speed up hash literals by duping 2018-12-06 18:28:21 +00:00
test_key_error.rb error.c: KeyError missing keyword arguments 2018-01-26 06:41:13 +00:00
test_keyword.rb parse.y: fix block passing with empty kwargs 2018-09-20 01:43:35 +00:00
test_lambda.rb
test_lazy_enumerator.rb Bug Fix Enumerator::Lazy#uniq state for multiple call 2018-03-13 01:00:08 +00:00
test_literal.rb Collapse putobject, putobject, newarray 2018-12-03 23:53:11 +00:00
test_m17n.rb string.c: setbyte silently ignores upper bits 2018-11-19 09:52:46 +00:00
test_m17n_comb.rb
test_marshal.rb marshal.c: allow marshalling keyword_init struct 2018-01-05 11:44:31 +00:00
test_math.rb math.c: adjust cbrt 2018-06-06 14:01:43 +00:00
test_metaclass.rb
test_method.rb Proc#<< and Proc#>> 2018-11-22 05:51:43 +00:00
test_mixed_unicode_escapes.rb parse.y (new_regexp): Fix SEGV of /#{"\u3042"}#{'い'}/ in non UTF-8 2018-01-16 01:43:25 +00:00
test_module.rb Fix problem about notimplemented case 2018-08-13 13:48:27 +00:00
test_not.rb Rename test classes to allow stable test count when running test-all -j 2018-03-13 06:29:02 +00:00
test_notimp.rb
test_numeric.rb enumerator.c: Introduce Enumerator::ArithmeticSequence 2018-08-06 09:08:28 +00:00
test_object.rb Add FrozenError as a subclass of RuntimeError 2017-12-12 00:46:34 +00:00
test_objectspace.rb
test_optimization.rb compile.c: fix peephole optimization 2018-10-24 10:38:39 +00:00
test_pack.rb pack.c: refine warning 2018-11-16 00:25:54 +00:00
test_parse.rb parse.y: remove "shadowing outer local variable" warning 2018-10-26 03:10:02 +00:00
test_path.rb
test_pipe.rb win32.c: EPIPE for ERROR_NO_DATA 2018-02-01 02:56:28 +00:00
test_primitive.rb
test_proc.rb Proc#<< and Proc#>> 2018-11-22 05:51:43 +00:00
test_process.rb process.c: fix ETXTBUSY from MJIT compiler process 2018-12-03 19:49:54 +00:00
test_rand.rb random.c: endless range random 2018-08-03 06:31:22 +00:00
test_range.rb range.c: Add Range#% 2018-09-28 02:18:58 +00:00
test_rational.rb refine parse_rat 2018-11-08 02:25:44 +00:00
test_rational2.rb
test_readpartial.rb
test_refinement.rb Enable refinements at Object#respond_to? 2018-11-22 08:29:02 +00:00
test_regexp.rb commit miss 2018-12-04 10:51:57 +00:00
test_require.rb $SAFE as a process global state. [Feature #14250] 2017-12-28 20:09:24 +00:00
test_rubyoptions.rb parse.y: remove "shadowing outer local variable" warning 2018-10-26 03:10:02 +00:00
test_rubyvm.rb
test_rubyvm_mjit.rb skip tests if --disable-mjit-support. 2018-10-20 08:06:50 +00:00
test_settracefunc.rb add tests for script_compiled TP event. 2018-12-06 13:53:48 +00:00
test_signal.rb thread_pthread.c: main thread always gets hit by signals 2018-08-25 21:59:30 +00:00
test_sleep.rb
test_sprintf.rb test_sprintf.rb: test for %p 2018-09-15 08:39:07 +00:00
test_sprintf_comb.rb
test_string.rb change diaeresis from above to below for better visibility 2018-12-04 10:49:55 +00:00
test_stringchar.rb
test_struct.rb Enumerable#to_h with block and so on 2018-09-20 15:06:56 +00:00
test_super.rb test/ruby/test_super.rb: Remove unused assertions 2018-04-17 08:52:25 +00:00
test_symbol.rb Revert "Symbol refinements" 2018-12-04 04:22:08 +00:00
test_syntax.rb parser: improve error messages 2018-11-25 08:31:40 +00:00
test_system.rb test/ruby/test_system.rb: suppress prompt and echo on Windows 2018-08-18 02:44:35 +00:00
test_thread.rb thread_sync.c (mutex_ptr): handle mutexes held by parent threads in children 2018-12-05 18:58:45 +00:00
test_thread_cv.rb revisit more MJIT test skips 2018-10-22 15:49:22 +00:00
test_thread_queue.rb appveyor.yml: give up running TestThreadQueue#test_queue_with_trap 2018-10-07 14:05:56 +00:00
test_threadgroup.rb
test_time.rb Normalize month-mday before finding epoch 2018-11-25 16:23:18 +00:00
test_time_tz.rb time.c: rescue find_timezone when loading 2018-11-28 14:08:35 +00:00
test_trace.rb
test_transcode.rb Add FrozenError as a subclass of RuntimeError 2017-12-12 00:46:34 +00:00
test_undef.rb Test for undef'ed method in class hierachy 2018-11-16 04:21:57 +00:00
test_unicode_escape.rb
test_variable.rb Add FrozenError as a subclass of RuntimeError 2017-12-12 00:46:34 +00:00
test_vm_dump.rb test_vm_dump.rb: skip if gcc 2017-12-16 00:36:31 +00:00
test_weakmap.rb test_weakmap.rb: skip unstable assertion 2018-03-16 14:12:39 +00:00
test_whileuntil.rb
test_yield.rb
ut_eof.rb