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

Tobias Hartmann tobias.hartmann at oracle.com
Fri Jul 13 12:43:10 UTC 2018


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