Great information, thanks so much.

It would be super-cool if v8 could use cleanly-structured prototype chains
to do fast property lookups. If I understand correctly, the potential would
be for the performance of this sort of method lookup to be somewhat
comparable to lookup of overridden methods in Java -- something worth
looking forward to.

Cheers,
Cris


On Thu, Aug 29, 2013 at 10:31 AM, Toon Verwaest <verwa...@chromium.org>wrote:

> So exactly in that you will not get speedup with the _current_ system.
>
> Since the prototypes are different objects, the receivers will have
> different maps. That means you are doing a polymorphic call. In Crankshaft
> we have an optimization that tries to handle those cases as if they were
> monomorphic, but only if the prototype object of all maps is exactly the
> same object. See line src/hydrogen.cc:6054:
> 6039 bool HOptimizedGraphBuilder::TryCallPolymorphicAsMonomorphic(
> ...
> 6051   for (int count = 1; count < types->length(); ++count) {
> 6052     Handle<Map> test_map(types->at(count));
> 6053     if (!CanLoadPropertyFromPrototype(test_map, name, &lookup))
> return false;
> 6054     if (test_map->prototype() != *prototype) return false;
> 6055   }
>
> We could in the future extend this to do exactly what you suggest
> (probably fairly easily); but it's not there right now.
>
> regards,
> Toon
>
>
> On Thu, Aug 29, 2013 at 6:53 PM, Cris Perdue <c...@perdues.com> wrote:
>
>> Toon, Jacob,
>>
>> Thank you both for your interest in the subject and and taking time to
>> respond.
>>
>> I am  encouraged by some of your comments, in particular Toon's that
>> receiver code can be optimized (presumably when "this" is of the same
>> hidden class in all calls); and Jacob's comment that what applies to
>> objects also applies to prototypes.
>>
>> For what it's worth, my application uses trees of expressions of
>> different types (classes), with recursive methods that walk over those
>> trees, so the  recursive methods cannot generally be inlined in any case.
>>
>> To be more specific about my optimization question, I am imagining that
>> object property lookups, including method lookups, may be inlined when a
>> variable always has the same hidden class. (I understand that the method
>> body would not be inlined.) I am further hoping that the good performance
>> of method lookups can extend to situations where the method is a property
>> of the prototype(s), even when receivers can have different prototypes,
>> provided that each prototype is built with the same properties, added in
>> the same order, so hopefully having the same hidden class.
>>
>> The recommendation to measure of course is always a sound one. I am
>> hoping you all may be able to help me avoid spending my time on experiments
>> that pursue optimizations that do not exist.
>>
>> Best regards,
>> Cris
>>
>>
>> On Wed, Aug 28, 2013 at 1:29 AM, Jakob Kummerow 
>> <jkumme...@chromium.org>wrote:
>>
>>> As always: when in doubt, measure it! Implement several approaches (in a
>>> simplified version of your app if necessary) and see for yourself if any of
>>> the options you're considering makes a difference.
>>>
>>> Generally I would say that what applies to objects also applies to
>>> prototypes (as they're objects too), but your question is too vague to even
>>> try to give a precise answer. As Toon said, the key idea that we keep
>>> emphasizing is to keep code monomorphic, but you stated that your code
>>> relies on polymorphism, so much of the battle is already lost anyway.
>>> As for inlining,  that's generally at odds with polymorphism -- when you
>>> don't know where a call is going, how can you possibly inline it? (Well,
>>> you can, but you have to inline all possible targets, which makes it a much
>>> tougher tradeoff.) Maybe it doesn't matter if your bottleneck is elsewhere?
>>>
>>>
>>> On Tue, Aug 27, 2013 at 7:50 PM, Toon Verwaest <verwa...@chromium.org>wrote:
>>>
>>>> Such optimizations are only true for receivers. If you have different
>>>> prototypes all over the place, your code is going is not going to stay
>>>> monomorphic. For every distinct prototype there's at least unique hidden
>>>> class; given that the prototype link is hardwired in the hidden class.
>>>>
>>>> regards,
>>>> Toon
>>>>
>>>>
>>>> On Tue, Aug 27, 2013 at 6:40 PM, Cris Perdue <cris.per...@gmail.com>wrote:
>>>>
>>>>> Performance optimization advice from the V8 team emphasizes
>>>>> initializing properties to objects in constructors, and always in the same
>>>>> order (for example http://www.youtube.com/watch?v=UJPdhx5zTaw). The
>>>>> explanation is that this way each instance belongs to the same hidden 
>>>>> class.
>>>>>
>>>>> What if you have fairly computation-intensive code that uses
>>>>> subclassing and polymorphism? In this case method lookups need to go
>>>>> through the prototype object for the instances. Once execution gets to the
>>>>> type-specific method, life should be good again because that code always
>>>>> receives a "this" and arguments of the same type at each invocation. (The
>>>>> type-specific method code is typically fairly short and quick to execute 
>>>>> in
>>>>> my software.)
>>>>>
>>>>> My question is, to what degree should we expect a similar principle to
>>>>> apply, that prototypes for subclasses should have the same members and the
>>>>> members should be added to each subclass in the same order? Will this make
>>>>> the compiler recognize the prototypes as belonging to the same hidden 
>>>>> class
>>>>> and make a big contribution to fast method lookup? Will method lookup code
>>>>> tend to be inlined? Is it OK that the prototypes are all directly 
>>>>> instances
>>>>> of Object, and not some application-specific class?
>>>>>
>>>>> Thanks much for any insights here.
>>>>>
>>>>> -Cris
>>>>>
>>>>  --
>>> --
>>> v8-users mailing list
>>> v8-users@googlegroups.com
>>> http://groups.google.com/group/v8-users
>>> ---
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "v8-users" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/v8-users/Heqrs8ob3n4/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to
>>> v8-users+unsubscr...@googlegroups.com.
>>>
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>
>>  --
>> --
>> v8-users mailing list
>> v8-users@googlegroups.com
>> http://groups.google.com/group/v8-users
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "v8-users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to v8-users+unsubscr...@googlegroups.com.
>>
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>  --
> --
> v8-users mailing list
> v8-users@googlegroups.com
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "v8-users" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/v8-users/Heqrs8ob3n4/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> v8-users+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to