From 29ca20de2d998d21c0d41224799182020311ea76 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Thu, 27 Apr 2017 04:21:04 +0000 Subject: refactor newhash (revision 58463 another try) [fix GH-1600] * st.c (rb_hash_bulk_insert): new API to bulk insert entries into a hash. Given arguments are first inserted into the table at once, then reindexed. This is faster than inserting things using rb_hash_aset() one by one. This arrangement (rb_ prefixed function placed in st.c) is unavoidable because it both touches table internal and write barrier at once. * internal.h: delcare the new function. * hash.c (rb_hash_s_create): use the new function. * vm.c (core_hash_merge): ditto. * insns.def (newhash): ditto. * test/ruby/test_hash.rb: more coverage on hash creation. * test/ruby/test_literal.rb: ditto. ----------------------------------------------------------- benchmark results: minimum results in each 7 measurements. Execution time (sec) name before after loop_whileloop2 0.136 0.137 vm2_bighash* 1.249 0.623 Speedup ratio: compare with the result of `before' (greater is better) name after loop_whileloop2 0.996 vm2_bighash* 2.004 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58492 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'vm.c') diff --git a/vm.c b/vm.c index e64c072fdc..de2cee9485 100644 --- a/vm.c +++ b/vm.c @@ -2653,13 +2653,9 @@ static VALUE core_hash_merge_kwd(int argc, VALUE *argv); static VALUE core_hash_merge(VALUE hash, long argc, const VALUE *argv) { - long i; - Check_Type(hash, T_HASH); VM_ASSERT(argc % 2 == 0); - for (i=0; i