I wondered if this would work if I handed the result off to a helper class

public class VoidHelper {
    public static void voidLong(long x) {}
}

If this somehow improved the code path, with inlining etc it would be 
basically free.

...but the generated code gets worse.

    public void apply(final long k, final long n) {
        this.total += n;
        final long longCast = RT.longCast(Numbers.num(this.total));
        this = null;
        VoidHelper.voidLong(longCast);
    }

total is long, but we box it with Numbers.num and then RT.longCast it 
before calling voidLong. Hmmm. Feels like the knowledge that it's returning 
a primitive type is missing.

Thanks,

Pete Windle
On Sunday, May 15, 2022 at 1:39:08 PM UTC+1 pete windle wrote:

> Definitely in the same wheelhouse, but upgrading to 1.11.1 shows the same 
> behaviour - as expected, because this is not an InstanceMethodExpr.
>
>
> https://github.com/clojure/clojure/blame/master/src/jvm/clojure/lang/Compiler.java#L1831-L1842
>  
> is the logic for StaticMethodExpr.
>
> AssignExpr hands off to the AssignableExpr target which in my case is 
> the InstanceFieldExpr(?)
>
> Takes us to here I guess: 
> https://github.com/clojure/clojure/blame/master/src/jvm/clojure/lang/Compiler.java#L1237-L1259
>
> Unless I roll my sleeves up and debug into this to check exactly where the 
> boxing is being emitted not sure I will get further, feels like I'm deeper 
> in the innards of Compiler.java than I'm qualified for without more thought 
> and reading.
>
> Thanks though, helpful pointer!
>
> Pete Windle
>
> On Sunday, May 15, 2022 at 1:17:10 PM UTC+1 er...@assum.net wrote:
>
>> This reminds me of a bug that I believe Ghadi fixed for 1.11, 
>>
>> https://clojure.atlassian.net/browse/CLJ-2621
>>
>> Don’t know if that helps much, though. 
>>
>> Erik. 
>> -- 
>> i farta
>>
>> 15. mai 2022 kl. 14:11 skrev pete windle <goo...@pete23.com>:
>>
>> Hey, I'm trying to work on some performance sensitive code using Clojure 
>> together with the Carrotsearch HPPC library. I've come up against a weird 
>> behaviour of set! in conjunction with primitive maths.
>>
>>
>> This example is a toy problem not a production problem, but there are 
>> things I might not be harder to do at work w/Clojure.
>>
>> I have a com.carrotsearch.hppc.LongLongHashMap and I wish to sum the 
>> contents of the map. They provide a com.carrotsearch.hppc.LongLongProcedure 
>> where an apply method is called for each k, v.
>>
>> Thence:
>> (defprotocol ValueRetriever
>>   (get-value [this ^LongLongHashMap memory]))
>>
>> (deftype ValueAdder [^{:unsynchronized-mutable true} ^long total]
>>   LongLongProcedure
>>   (^void apply [this ^long k ^long v]
>>    (set! total (unchecked-add total v)))
>>   ValueRetriever
>>   (get-value [this memory] (set! total 0) (.forEach memory this) total))
>>
>> To a first approximation all of the time spent summing the map is in the 
>> apply method as expected, however when I profile it with YourKit every 
>> sample taken is actually in clojure.lang.Numbers.num. Using the extremely 
>> handy *clj-java-decompiler *library I can try to see what's happening, 
>> and it looks like we're attempting to box the return value from set!
>>
>>     public void apply(final long k, final long n) {
>>         Numbers.num(this.total += n);
>>     }
>>
>>
>> Is there some technique I can use to stop the return value from set! 
>> being boxed (before the box is discarded to the void)?
>>
>> I do have real use cases where a rather tight aggregation loop will be 
>> called for many millions of values and I'd prefer not to incur this cost.
>>
>> Workaround is obviously to write the aggregators in Java but that's 
>> strongly not preferred, at the point I'm mixing modes I might as well write 
>> the whole core in Java.
>>
>> Cheers,
>>
>> Pete Windle
>>
>> -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to clojure+u...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/clojure/d9eccd28-3db3-4e6f-88f9-7a4106fc05aan%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/clojure/d9eccd28-3db3-4e6f-88f9-7a4106fc05aan%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/clojure/3d3b07f0-123b-4bf3-b79e-988c72db0dbfn%40googlegroups.com.

Reply via email to