java.util.Map#[]= is up to 20 times slower than #put ----------------------------------------------------
Key: JRUBY-5885 URL: https://jira.codehaus.org/browse/JRUBY-5885 Project: JRuby Issue Type: Improvement Components: Java Integration Affects Versions: JRuby 1.6.2 Environment: jruby 1.6.2 (ruby-1.9.2-p136) (2011-05-23 e2ea975) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_24) [darwin-x86_64-java] Reporter: Theo Hultberg Priority: Minor For some reason using {{#[]=}} on a Java {{Map}} object is much slower than using its {{#put}} method. It is much slower than would be expected and a trivial alias from {{#put}} to {{#[]=}} makes them equally fast. Here's a benchmark: {code} user system total real HashMap#[]= 0.303000 0.000000 0.303000 ( 0.303000) HashMap#put 0.014000 0.000000 0.014000 ( 0.014000) Hash#[]= 0.006000 0.000000 0.006000 ( 0.006000) {code} code: {code} require 'benchmark' require 'java' n = 1000 import java.util.HashMap Benchmark.bm(30) do |x| x.report('HashMap#[]=') do h = HashMap.new n.times do |i| h["#{i}"] = i end end x.report('HashMap#put') do h = HashMap.new n.times do |i| h.put("#{i}", i) end end x.report('Hash#[]=') do h = {} n.times do |i| h["#{i}"] = i end end end {code} adding {code} class HashMap alias_method :[]=, :put end {code} makes the numbers for {{#[]=}} and {{#put}} the same. I have no idea why the {{#[]=}} method is so slow. I couldn't find where it was defined in the JRuby source. I found {{List#[]=}}, but not {{Map#[]=}} -- but perhaps I just didn't look for the right thing, and I hope there's nothing obvious I've overlooked. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email