RFR: improve warmup time for lambda capture
Sergey Kuksenko
sergey.kuksenko at oracle.com
Thu Aug 22 06:04:22 PDT 2013
Fixed!
Here is new webrev:
http://cr.openjdk.java.net/~skuksenko/jsr335/static_factory/webrev.01/
On 08/21/2013 09:30 PM, Brian Goetz wrote:
> Or, for a more proximate example, look about 20 lines down in the same
> file, in the "generateConstructor()" method :)
>
> On 8/21/2013 1:17 PM, Esko Luontola wrote:
>> The following code does fails to handle primitive types. The xLOAD
>> opcode depends on the type of the argument. Also long and double require
>> the index to be incremented by two instead of one.
>>
>> + for (int i = 0; i < argTypes.length; i++) {
>> + m.visitVarInsn(ALOAD, i);
>> + }
>>
>> Here is an example of a proper way to generate that code:
>>
>> https://github.com/orfjackal/retrolambda/blob/411579c012cd153351470fd5a828348c6bd99eb2/retrolambda/src/main/java/net/orfjackal/retrolambda/LambdaClassBackporter.java#L96-L100
>>
>>
>>
>> Sergey Kuksenko wrote on 21.8.2013 19:41:
>>> Hi,
>>>
>>> Please review the webrev at:
>>>
>>> http://cr.openjdk.java.net/~skuksenko/jsr335/static_factory/webrev.00/
>>>
>>> Also I need a sponsor to commit.
>>>
>>> The issue with lambda capture warmup is related to current jsr292
>>> implementation.
>>> Lambda metafactory creates call site which points to (MethodHandle)
>>> lambda generated class constructor. Invocation of the constructor is
>>> performed via some generated call chain (jsr292 implementation
>>> specific). When C1 or C2 compiles it - all these methods are inlined and
>>> code is clean, but interpretation is relatively slow. Such jsr292 call
>>> chain for static methods (MH to static method) is simpler than to
>>> constructor that is why it is warmed up faster.
>>> The patch generated static factory method for lambda capture in each
>>> generated class and links CallSite to the static factory method.
>>> Attached charts shows warmup improvement (both tiered and
>>> non-tiered
>>> compilation). The benchmark creates 4000 different lambdas, each lambda
>>> captures one variable.
>>> Of course this improvement is implementation specific and depends on
>>> jsr292 implementation. In future (when/if jsr292 will warmup MH to
>>> constructor with the same speed as MH to static method) we may revert it
>>> back.
>>>
>>>
>>>
>>>
>>>
>>>
>>
--
Best regards,
Sergey Kuksenko
More information about the lambda-dev
mailing list