Sure: https://play.golang.org/p/W_ruqI22Vhv
Seems a fairly straight-forward transformation to me - and again easy to
devirtualize.

On Thu, Oct 25, 2018 at 8:56 AM roger peppe <rogpe...@gmail.com> wrote:

>
> On Thu, 25 Oct 2018, 12:52 am Axel Wagner, <axel.wagner...@googlemail.com>
> wrote:
>
>> On Thu, Oct 25, 2018 at 12:39 AM roger peppe <rogpe...@gmail.com> wrote:
>>
>>> I understand this argument. By putting some smarts into the compiler, we
>>> would hope that we can see benefits not just in our generated generic code,
>>> but also in other code that we've already written that uses generics. This
>>> would be great if it wasn't very hard to do.
>>>
>>
>> We disagree here. I still maintain that it is not harder. My intention
>> above was to illustrate that, by assuming we have the generics-problem
>> (including a heuristic to decide what to specialize) solved and then
>> solving the devirtualization-problem using that solution. Unfortunately,
>> that still seems to be unconvincing to you, though.
>>
>> For example (I got a little carried away here), here's an idea of what
>>> some generated code using a reflect-based approach might look like:
>>>
>>>     https://github.com/rogpeppe/genericdemo/blob/master/naive/naive.go
>>>
>>
>> I'm sorry, but this seems like a strawman. This is how a realistic
>> dynamic approach would look like:
>> https://play.golang.org/p/Fbs0cpAnE43
>>
>
> Try that again with the generic sum function instead of addPair, which I
> only included so I could explore what it looked like when one generic
> function calls another.
>
> or, if you prefer, using methods:
>> https://play.golang.org/p/6YsyJaVQ789
>> And yeah, I maintain that it's easy to devirtualize that. Especially if
>> we can give the compiler hints, like for example,
>> https://play.golang.org/p/TZNQRlvofw2
>>
>> Anyway. I give up, I guess :)
>>
>>
>>>
>>> Imagine how smart the compiler would have to be in order to
>>> reverse-engineer that back to the equivalent inline code!
>>> You'd end up having to write patterns for the exact code that is
>>> produced from the compiler, with the danger that you wouldn't hit any real
>>> code at all (and also, coming up with sound optimisations for small
>>> variations in reflect code is likely to be really hard).
>>> I suspect you'd end up with a very slow and very fragile compiler.
>>>
>>> FWIW I went a bit further and experimented with some more potential
>>> representations of generic Go code so I could get an idea of the likely
>>> overheads. The approach of sharing implementations that use the same
>>> size/pointer layout seems to work ok, with about a 3 or 4 ns overhead per
>>> generic call on my machine (about half the speed of a direct function
>>> call). My experimentation is here:
>>> https://github.com/rogpeppe/genericdemo/blob/master/generated.go . It
>>> actually shouldn't be that hard to write some code to produce that kind of
>>> code automatically, "gofront" if you like, without updating the compiler
>>> wholesale. I need to stop now :)
>>>
>>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to