On Sep 20, 2005, at 12:26 AM, Robin Garner wrote:

I think it's important not to take Tim's point about performance too
lightly here.  There are some key interfaces between components that
can't afford the overhead of a function call, let alone an indirect
call via a function pointer.

Three instances that come to mind are:
- Allocation.  For best performance, the common case of a new() needs
  to be inlined directly into the compiled code.
- Write barrier (and read barrier if we need one).  The common case
  of a write barrier should be a handful of instructions.
- Yield points.  Again should inline down to a couple of instructions.

I'd be interested in any approaches you may have thought of for these
interfaces.

Are these things the components would worry about, or can an optimizer deal with these "later" if possible?

Now, I'm really just making this up as I go along... what some people call "thinking out loud", but I won't grace this with the term "thinking". I've never written or been inside VM internals, so I'm inventing out of whole cloth here...

In earlier discussions of componentization, I kept imagining a model where we have a defined set of capabilities that a component could optionally implement. There would be a required set, as well as optional ones. (This thinking is inspired by the old MSFT COM infrastructure...)

In the case of a memory manager, a required one would be the "interface" containing the function pointers for a memory management.

An optional one would be "NativeInlineConversion" or something, where an optimizer could find a new() and if it doesn't support the native inlineing, use the function call into the component, and if it does, ask the component for the bit of complied code to use.

I'll sketch these out in code once we get David's code contributed properly into JIRA and we register his ACQ.

On Mon, 2005-09-19 at 19:46 +0200, David Tanzer wrote:

Today I have added some additional Information to the Wiki page.

We should also consider using C++ and abstract classes to maintain our
component model. While this would make inter-component communication
slightly slower it would be easier to maintain. We should also think
about using an existing component model like OSGi.

The model I posted provides pretty fast communication between components without sacrificing too much flexibility, but it is maybe not as easy to maintain as a clean, object-oriented implementation (i.e. C++). We could
discuss how important these aspects are to us, i.e. how much runtime
efficiency we are willing to sacrifice for maintainability and
flexibility and vice-versa.


First order of priority, IMO, is to decide what are the performance
critical components, and what are not. For the infrequent cases, we can
afford a heavy-weight approach, for those that happen every few
bytecodes, we need to be lean and mean.


Is this the kind of optimization you want to do now, or do we want to put together a structure that supports it for later?

geir

--
Geir Magnusson Jr                                  +1-203-665-6437
[EMAIL PROTECTED]


Reply via email to