boxing + unboxing a VT is not a no-op ?

forax at univ-mlv.fr forax at univ-mlv.fr
Fri Jul 13 13:11:07 UTC 2018


the source code is here:
  https://github.com/forax/valuetype-lworld/blob/master/src/test/java/fr.umlv.valuetype/fr/umlv/valuetype/perf/ReifiedListBenchMark.java#L118

the instructions about how to build are here:
  https://github.com/forax/valuetype-lworld

Rémi

----- Mail original -----
> De: "Tobias Hartmann" <tobias.hartmann at oracle.com>
> À: "Remi Forax" <forax at univ-mlv.fr>, "valhalla-dev" <valhalla-dev at openjdk.java.net>
> Envoyé: Vendredi 13 Juillet 2018 14:43:10
> Objet: Re: boxing + unboxing a VT is not a no-op ?

> Hi Remi,
> 
> thanks for reporting. Could you please provide the full source code so we can
> have a closer look?
> 
> Best regards,
> Tobias
> 
> On 12.07.2018 20:43, Remi Forax wrote:
>> Hi guys,
>> it seems that operations likes VT -> Object -> VT are not optimized has being a
>> no-op.
>> 
>> with IntBox being a value type that wrap an int,
>> this code is slow (not very slow, i.e not interpreter slow)
>> 
>>    public int valuelist_intbox_innervalue_inlined_reduce() {
>>     __ByValue class Adder implements BiFunction<IntBox, IntBox, IntBox> {
>>       private final boolean nonEmpty;
>>       
>>       Adder() {
>>         nonEmpty = false;
>>         throw new AssertionError();
>>       }
>>       
>>       public IntBox apply(IntBox acc, IntBox element) {
>>         return acc.add(element);
>>       }
>>     }
>>     BiFunction<IntBox, IntBox, IntBox> mapper = __MakeDefault Adder();
>>     var sum = IntBox.zero();
>>     int size = valueList.size();
>>     for(int i = 0; i < size; i++) {
>>       sum = mapper.apply(sum, valueList.get(i));
>>     }
>>     return sum.intValue();
>>   }
>> 
>> while this code is fast (more than 10 times faster)
>>   public int valuelist_intbox_inlined_reduce() {
>>     var sum = IntBox.zero();
>>     int size = valueList.size();
>>     for(int i = 0; i < size; i++) {
>>       sum = sum.add(valueList.get(i));
>>     }
>>     return sum.intValue();
>>   }
>> 
>> the difference is that instead of calling add on an IntBox to do the addition,
>> i used an anonymous value class which implement a functional interface which
>> used Objects.
>> (valueList is just an array of IntBox wrapped in a value type).
>> 
>> regards,
>> Rémi
>> 



More information about the valhalla-dev mailing list