EXT: Re: series of switchpoints or better
Jochen Theodorou
blackdrag at gmx.org
Wed Oct 5 22:08:45 UTC 2016
On 05.10.2016 21:45, Charles Oliver Nutter wrote:
> On Wed, Oct 5, 2016 at 1:36 PM, Jochen Theodorou <blackdrag at gmx.org
> <mailto:blackdrag at gmx.org>> wrote:
>
> If I hear Remi saying volatile read... then it does not sound free
> to me actually. In my experience volatile reads still present
> inlining barriers. But if Remi and all of you tell me it is still
> basically free, then I will not look too much at the volatile ;)
>
> The volatile read is only used in the interpreter.
ah... I see.. nice. I get the feeling Remi actually already said this...
> In Groovy we use SwitchPoint as well, but only one for the whole
> meta class system.... that could clearly improved it seems. Having a
> Switchpoint per method is actually a very interesting approach I
> would not have considered before, since it means creating a ton of
> Switchpoint objects. Not sure if that works in practice for me since
> it is difficult to make a switchpoint for a method that does not
> exist in the super class, but may come into existence later on -
> still it seems I should be considering this.
>
> I suspect Groovy developers are also less likely to modify classes at
> runtime? In Ruby, it's not uncommon to keep creating new classes or
> modifying existing ones at runtime, though it is generally discouraged
> (all runtimes suffer).
It depends a bit on the style if it is done more or less often. But I
think the majority barely changes the classes. but compared to Ruby
probably a lot less.
We have a construct, that adds dynamically methods to multiple classes
with a limited thread visibility and lifetime (Categories), but those
are actually not realized as meta class changes. Creating a new class
can happen any time, but they tend not to be build, they are declared
with all the methods you want in there already usually.
> cold performance is a consideration for me as well though. The heavy
> creation time of MethodHandles is one of the reasons we do not use
> invokedynamic as much as we could... especially considering that
> creating a new cache entry via runtime class generation and still
> invoking the method via reflection is actually faster than producing
> one of our complex method handles right now.
>
> Creating a new cache entry via class generation? Can you elaborate on
> that? JRuby has a non-indy mode, but it doesn't do any code generation
> per call site.
well, the code generation is optional, otherwise we use reflection in
that mode. WE use the technique since I think 2008. And basically you
have an interface call(Object[]), which we produce an implementation for
at runtime and then call it. We use MagicAccessorImpl to avoid bytecode
validation... well... if existing/accessible, not sure that is still the
case in jdk9 though
[...]
> Ahh, so when you invalidate, you only invalidate one class, but every
> call site would have a SwitchPoint for the target class and all of its
> superclasses. That will be more problematic for cold performance than
> JRuby's way, but less overhead when invalidating. I'm not which
> trade-off is better.
have to test it out in the future.
> We also use this invalidation mechanism when calling dynamic methods
> from Java (since we also use call site caches there) but those sites are
> not (yet) guarded by a SwitchPoint.
yes, we have a very few cases like this as well.
[...]
> With recent improvements to MH boot time and cold performance, I've
> started to use indy by default in more places, carefully measuring
> startup overhead along the way. I'm well on my way toward having fully
> invokedynamic-aware jitted code basically be all invokedynamics.
invokedynamic by default is the way to go ;)
> It is also good to hear that the old "once invalidated, it will not
> optimized again - ever" is no longer valid.
>
> And hopefully it will stay that way as long as we keep making noise :-)
indeed ;)
bye Jochen
More information about the mlvm-dev
mailing list