Bill Dortch wrote:
re: hash implementation: The hashes are implemented directly for performance. Performance is improved (over using ConcurrentHashMap) in several ways:

- The overhead of segment lookup/reference is eliminated. CHM breaks a hash table into segments (default 16) to reduce write contention. For our purposes, that doesn't buy much; ivar access will typically be single-threaded, and constants (usually) and symbols (always) are write-once (though the symbol table might still benefit from a segmented approach, we can look at that later).

- Faster lookups are possible for keys that we know to be interned strings. I don't have any hard numbers on the percentage of gets/sets that pass interned strings, but I'd wager it's better than 90% (probably more like 99%), as every name that comes from an AST node is interned. The performance benefit is significant.

- A slightly different lookup algorithm saves one volatile read per lookup (my approach uses reads/writes to the volatile array field itself [not entries, the field!] rather than a volatile size field to trigger memory barriers).

 - A CHECKCAST is avoided for each read.

- Implementing the tables directly rather than as a component provided a significant performance benefit -- somewhat to my surprise. I did originally take the latter approach. The code is in bdortch/attrs/src/org/jruby/runtime/component, in VariableStore (abstract base class) and ConcurrentObjectVariableStore, which may yet find some use (in a somewhat modified form) once we refactor IRubyObject/RubyObject. However, I don't think it's unreasonable to implement these directly for performance (see RubyArray and RubyHash, for instance).

re: JMM thread, I'll try to find it, it's been a couple of months since I looked at that stuff. I think it dated to 2004, or possibly late 2003, prior to the release of Java 1.5, but around the time JSR-133 was released. In any case, I'm going to play it safe for now and fall back on the readValueUnderLock technique.

re: moving internal/special vars to attrs, that should be a goal, though these are in some cases used only for marshaling.

re: IDs, in the abstract I like the idea, need to see what that means in concrete terms, what the overhead would be, etc. In the meantime, I think the rule can be, when in doubt, don't call the "fast" accessors. Maybe I should rename them: scaryFastGetInstanceVariable?

-Bill
So, when will this land? The instance var and constant access seems to be the current bottleneck when profiling - it would be nice to have this in.

Cheers

--
Ola Bini (http://ola-bini.blogspot.com) JRuby Core Developer
Developer, ThoughtWorks Studios (http://studios.thoughtworks.com)
Practical JRuby on Rails (http://apress.com/book/view/9781590598818)

"Yields falsehood when quined" yields falsehood when quined.



---------------------------------------------------------------------
To unsubscribe from this list please visit:

   http://xircles.codehaus.org/manage_email

Reply via email to