The name Hasher implies that it would be an object. Could it not be just a set 
of static methods?

Is there a library that does this for us?

> On Jul 17, 2020, at 7:26 AM, Haisheng Yuan <[email protected]> wrote:
> 
> +1
> I am not sure the difference will be observable in real Calcite application, 
> because object allocation in Java is pretty efficient. But it is always good 
> to avoid unnecessary object allocation and reduce GC pressure if we can 
> achieve it easily.
> 
> On 2020/07/17 09:36:06, Vladimir Sitnikov <[email protected]> 
> wrote: 
>> Hi,
>> 
>> java.lang.Objects.hash is convenient, however, it does result in memory
>> allocation for varargs.
>> 
>> In practice, it can easily be visible in the benchmarks (at least for Java
>> 1.8), so I suggest we create our own API
>> and use it instead of java.util.Objects#hash
>> 
>> We can have "up to 10 overloads" (or whatever we need), so the hashcode
>> won't need to allocate arrays.
>> 
>> If no objections within a week or so, I will commit that fix, and I would
>> add `java.util.Objects#hash` to the list of forbidden APIs.
>> 
>> I'm ok if somebody else wants to pick this.
>> 
>> ---
>> Sample with a4fa05458840cfd:
>> 
>> @Benchmark
>> public RexNode baseline_eq() {
>>  return rex.makeCall(
>>      SqlStdOperatorTable.EQUALS,
>>      rex.makeInputRef(intType, 0),
>>      rex.makeInputRef(intType, 1));
>> }
>> 
>> @Benchmark
>> public int equals(Blackhole blackhole) {
>>  RexNode node = rex.makeCall(
>>      SqlStdOperatorTable.EQUALS,
>>      rex.makeInputRef(intType, 0),
>>      rex.makeInputRef(intType, 1));
>>  blackhole.consume(node);
>>  return node.hashCode();
>> }
>> 
>> ...
>> 
>> Benchmark                            Mode  Cnt  Score Error  Units
>> baseline_equals                      avgt    5   222 ± 121   ns/op
>> equals                               avgt    5   248 ±  68   ns/op
>> greater_than                         avgt    5   275 ±  54   ns/op
>> less_than                            avgt    5   224 ±  27   ns/op
>> 
>> baseline_equals:·gc.alloc.rate.norm  avgt    5   496 ±   0    B/op
>> equals:·gc.alloc.rate.norm           avgt    5   568 ±   0    B/op
>> greater_than:·gc.alloc.rate.norm     avgt    5   624 ±   0    B/op
>> less_than:·gc.alloc.rate.norm        avgt    5   520 ±   0    B/op
>> 
>> 
>> Vladimir
>> 

Reply via email to