With much experimentation, I ended up with this:

  (let [a 1
        b (.longValue ^Long (:foo {:foo 3}))
        c (if (< a b) a b)])

which seems to avoid the longCast call:

        Object o;
        if (_thunk__0__ == (o = _thunk__0__.get(const__3))) {
            o = (__thunk__0__ = __site__0__.fault(const__3)).get(const__3);
        }
        final long b = (long)o;
        final long c = (a < b) ? a : b;

I don't know if this is advisable. Does anyone do this?

Also just noted this is another case where explicitly calling something 
seems to make it disappear. :-p

On Wednesday, January 30, 2019 at 8:41:49 PM UTC-8, Brian Craft wrote:
>
> The full context is large. But, for example, in this code:
>
>   (let [a 1
>         b (:foo {:foo 3})
>         c (if (< a b) a b)])
>
> b and c are Object (if the disassembly is to be believed) which leads to 
> casts where c is used later. Also, the compare is calling Numbers.lt, which 
> is going to do a bunch of casting & dispatch.
>
> Adding a :long hint on b, b is still Object, and the compare becomes
>
>         if (a < RT.longCast(b)) {
>             num = Numbers.num(a);
>         }
>
> with a long cast that doesn't seem necessary. Also, c is still Object.
>
> Casting the lookup to long, like (long (:foo {:foo 3})), b and c are now 
> long, but there's now a cast on the return of the lookup
>
>         Object x;
>         if (_thunk__0__ == (x = _thunk__0__.get(const__4))) {
>             x = (__thunk__0__ = __site__0__.fault(const__4)).get(const__4);
>         }
>         final long b = RT.longCast(x);
>         final long c = (a < b) ? a : b;
>
> which is going to hit the RT.longCast(Object) method, and start probing 
> for the class so it can pick a method.
>
>
> On Wednesday, January 30, 2019 at 6:58:07 PM UTC-8, Alex Miller wrote:
>>
>> It would really help to see a full function of code context. From that I 
>> could probably talk a little more about what I would expect the compiler to 
>> understand and how you might be able to influence it.
>>
>> On Wed, Jan 30, 2019 at 8:50 PM Brian Craft <craft...@gmail.com> wrote:
>>
>>> If there is unnecessary casting or boxing, how do you avoid it? hinting 
>>> and casting affect it, but not in ways I understand, or can predict.
>>>
>>> On Wednesday, January 30, 2019 at 6:06:37 PM UTC-8, Alex Miller wrote:
>>>>
>>>> Sometimes the insertion of profiling instrumentation magnifies the cost 
>>>> of things in a hot loop or provides misleading hot spot info. If you're 
>>>> using a tracing profiler, you might try sampling instead as it's less 
>>>> prone 
>>>> to this.
>>>>
>>>> Or, this sounds silly, but you can manually sample by just doing a few 
>>>> thread dumps while it's running (either ctrl-\ or externally with kill -3) 
>>>> and see what's at the top. If there really is a hot spot, this is a 
>>>> surprisingly effective way to see it.
>>>>
>>>> For this kind of code, there is no substitute for actually reading the 
>>>> bytecode and thinking carefully about where there is unnecessary casting 
>>>> or 
>>>> boxing.
>>>>
>>>>
>>>>
>>>> On Wed, Jan 30, 2019 at 6:55 PM Brian Craft <craft...@gmail.com> wrote:
>>>>
>>>>> I haven't tried much. I'm getting the java 
>>>>> via clj-java-decompiler.core 'decompile' macro.
>>>>>
>>>>> A long cast does drop the cast (which is really counter-intuitive: 
>>>>> explicitly invoke 'long', which calls longCast, in order to avoid calling 
>>>>> longCast).
>>>>>
>>>>> Amusingly this doesn't reduce the total run-time, though longCast 
>>>>> drops out of the hotspot list. :-p There must be some other limiting step 
>>>>> that I'm missing in the profiler.
>>>>>
>>>>> I'm calling it around 1.2M times, so hopefully that engages the jit.
>>>>>
>>>>> On Wednesday, January 30, 2019 at 3:39:41 PM UTC-8, Alex Miller wrote:
>>>>>>
>>>>>> What have you tried? And how are you getting that Java? I would 
>>>>>> prefer to look at bytecode (via javap) to verify what you're saying. 
>>>>>>
>>>>>> Have you tried an explicit long cast?
>>>>>>
>>>>>> (aget flat-dict (bit-and 0xff (long (aget arr j))))
>>>>>>
>>>>>> Are you running this hot enough for the JIT to kick in? Usually this 
>>>>>> is the kind of thing it's good at, but it might take 10k invocations 
>>>>>> before 
>>>>>> it does.
>>>>>>
>>>>>>
>>>>>> On Wednesday, January 30, 2019 at 4:03:43 PM UTC-6, Brian Craft wrote:
>>>>>>>
>>>>>>> Profiling is showing a lot of time spent in RT.longCast, in places 
>>>>>>> like this:
>>>>>>>
>>>>>>> (aget flat-dict (bit-and 0xff (aget arr j)))
>>>>>>>
>>>>>>> arr is hinted as ^bytes, and flat-dict as ^objects.
>>>>>>>
>>>>>>> which compiles to this:
>>>>>>>
>>>>>>> Object code2 = RT.aget((Object[])flat_dict, RT.intCast(0xFFL & 
>>>>>>> RT.longCast((Object)RT.aget((byte[])arr2, RT.intCast(k)))))
>>>>>>>
>>>>>>> Is there any way to avoid that RT.longCast? There is an aget method 
>>>>>>> in RT.java that returns a byte, and a longCast for byte, but I suspect 
>>>>>>> the 
>>>>>>> cast to Object is causing it to hit the longCast for Object, which does 
>>>>>>> a 
>>>>>>> bunch of reflection.
>>>>>>>
>>>>>> -- 
>>>>> 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 a topic in the 
>>>>> Google Groups "Clojure" group.
>>>>> To unsubscribe from this topic, visit 
>>>>> https://groups.google.com/d/topic/clojure/vXJFuOujTaw/unsubscribe.
>>>>> To unsubscribe from this group and all its topics, send an email to 
>>>>> clojure+u...@googlegroups.com.
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>> -- 
>>> 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 a topic in the 
>>> Google Groups "Clojure" group.
>>> To unsubscribe from this topic, visit 
>>> https://groups.google.com/d/topic/clojure/vXJFuOujTaw/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to 
>>> clojure+u...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to