delegate.rb is incredibly slow
------------------------------
Key: JRUBY-4658
URL: http://jira.codehaus.org/browse/JRUBY-4658
Project: JRuby
Issue Type: Bug
Reporter: Charles Oliver Nutter
Assignee: Thomas E Enebo
Priority: Blocker
Fix For: JRuby 1.5
The Nokogiri guys reported that my "weakling" library was very slow. After
digging a bit, I traced the problem to WeakRef construction:
{noformat}
~/projects/jruby ➔ jruby -rbenchmark -rweakref -e "5.times { puts
Benchmark.measure { 1000.times { WeakRef.new(self) } } }"
1.439000 0.000000 1.439000 ( 1.418000)
1.068000 0.000000 1.068000 ( 1.068000)
1.038000 0.000000 1.038000 ( 1.037000)
1.041000 0.000000 1.041000 ( 1.041000)
1.054000 0.000000 1.054000 ( 1.054000)
{noformat}
This is basically taking more than 1ms to construct every object. A profile
showed that the time was spent doing two things: parsing, and twiddling
ConcurrentHashMap inside RubyModule. That led me to the delegate.rb library,
since WeakRef < Delegator.
It turns out that Delegator has some really dreadful code in its initialize,
which gets called for every construction:
{noformat}
def initialize(obj)
preserved = ::Kernel.public_instance_methods(false)
preserved -= ["to_s","to_a","inspect","==","=~","==="]
for t in self.class.ancestors
preserved |= t.public_instance_methods(false)
preserved |= t.private_instance_methods(false)
preserved |= t.protected_instance_methods(false)
break if t == Delegator
end
preserved << "singleton_method_added"
for method in obj.methods
next if preserved.include? method
begin
eval <<-EOS, nil, __FILE__, __LINE__+1
def self.#{method}(*args, &block)
begin
__getobj__.__send__(:#{method}, *args, &block)
ensure
[email protected]_if{|s|IgnoreBacktracePat=~s} if $@
end
end
EOS
rescue SyntaxError
raise NameError, "invalid identifier %s" % method, caller(4)
end
end
end
{noformat}
Because of this, the Nokogiri guys are not comfortable replacing id2ref usage
with WeakRef::IdHash from weakling (and I don't blame them). Since we really
don't want to turn id2ref support back on, I think we need to find a solution
for delegate.rb.
FWIW, 1.9 does have a better delegate.rb implementation, but it doesn't appear
to pass specs. So we are faced with a bit of a conundrum.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
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