On Tue, Dec 29, 2020 at 4:37 PM Arnaud Delobelle <arno...@gmail.com> wrote:

> Question 1: I *think* that the compiler has all the information necessary
> to implement type assertion to the Cont interface as I have, i.e. it knows
> only 3 types implement that interface, so could it not do the optimisation
> on my behalf?
>

>
Question 2: Or is it possible that other Go values can be made at runtime
> that would implement this interface but not be one of the three known types
> that implement it?
>

Yes, re 2. `reflect` can create new types at runtime. AFAIK the
implementation for interface-type-assertions is basically to look it up in
a global hashmap, which is pre-seeded with compile-time known types and
then gets filled on each (successful) inteface-type-assertion with the
correct method tables. But, I'm handwaving.

Under these assumptions, it might be *possible* to first check against the
statically known types and only fall back on the map if none of that
matches. But it doesn't seem 100% clear to me that that's always faster.

I think concrete type-assertions will always be faster than interface
type-assertions though - for a concrete type-assertions, it's really just
comparing the two type-pointers and copying the value (which, in your case,
is a pointer itself), whereas for an interface type-assertion, the actual
method table must be assembled or looked up.

But, here's a question: If `v.iface` always contains a `Cont` - at least
that's what I assume from the fact that you don't use a ,ok assertion - why
not just declare it as such, instead of `interface{}`?

Question 3: Is it possible that there is something dodgy going on with the
> benchmarks, with some code being optimised away - if so, how can I check
> that?
>

Sorry, no idea.


>
> Thanks in advance for any insights!
>
> --
> Arnaud
>
> [1] https://github.com/arnodel/golua
>
> [2] Definition of the Cont interface type:
> type Cont interface {
>     Push(Value)
>     PushEtc([]Value)
>     RunInThread(*Thread) (Cont, *Error)
>     Next() Cont
>     DebugInfo() *DebugInfo
> }
>
>
>
> --
> 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.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/efcf0a84-4e7d-4241-9f5a-994774a7f14dn%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/efcf0a84-4e7d-4241-9f5a-994774a7f14dn%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAEkBMfGhbAq5CS%2BG1VZJose%2BYLWncqFiFzKZQdXVmL22oFx_Ng%40mail.gmail.com.

Reply via email to