Two changes in attached patch:
- attr accessors should store interned name of variable
- attr accessor methods can be "fast"
Substantial improvement (this is with the standard ivars hashmap):
BEFORE:
100k loop of 100 attr accesses and assign to local; one ivar
2.695000 0.000000 2.695000 ( 2.695000)
2.621000 0.000000 2.621000 ( 2.621000)
1.839000 0.000000 1.839000 ( 1.840000)
1.836000 0.000000 1.836000 ( 1.836000)
1.915000 0.000000 1.915000 ( 1.915000)
AFTER:
100k loop of 100 attr accesses and assign to local; one ivar
1.675000 0.000000 1.675000 ( 1.675000)
1.695000 0.000000 1.695000 ( 1.695000)
0.905000 0.000000 0.905000 ( 0.905000)
0.908000 0.000000 0.908000 ( 0.908000)
0.899000 0.000000 0.899000 ( 0.899000)
I would expect similar results from attr setters, but I did not
benchmark them.
- Charlie
Index: src/org/jruby/RubyModule.java
===================================================================
--- src/org/jruby/RubyModule.java (revision 4182)
+++ src/org/jruby/RubyModule.java (working copy)
@@ -1094,11 +1094,11 @@
attributeScope = Visibility.PRIVATE;
// FIXME warning
}
- final String variableName = "@" + name;
+ final String variableName = ("@" + name).intern();
final Ruby runtime = getRuntime();
ThreadContext context = getRuntime().getCurrentContext();
if (readable) {
- defineMethod(name, new Callback() {
+ defineFastMethod(name, new Callback() {
public IRubyObject execute(IRubyObject self, IRubyObject[]
args, Block block) {
Arity.checkArgumentCount(getRuntime(), args, 0, 0);
@@ -1115,7 +1115,7 @@
}
if (writeable) {
name = name + "=";
- defineMethod(name, new Callback() {
+ defineFastMethod(name, new Callback() {
public IRubyObject execute(IRubyObject self, IRubyObject[]
args, Block block) {
// ENEBO: Can anyone get args to be anything but length 1?
Arity.checkArgumentCount(getRuntime(), args, 1, 1);
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email