Skip to content

Instantly share code, notes, and snippets.

@bruth
Created October 17, 2017 19:36
Show Gist options
  • Select an option

  • Save bruth/d2e469ae571d46296667d08aa3cba2e6 to your computer and use it in GitHub Desktop.

Select an option

Save bruth/d2e469ae571d46296667d08aa3cba2e6 to your computer and use it in GitHub Desktop.

Revisions

  1. bruth created this gist Oct 17, 2017.
    88 changes: 88 additions & 0 deletions invoc_test.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,88 @@
    package main

    import (
    "reflect"
    "testing"
    )

    type myint int64

    type Inccer interface {
    inc()
    }

    func (i *myint) inc() {
    *i = *i + 1
    }

    func BenchmarkReflectMethodCall(b *testing.B) {
    i := new(myint)
    incnReflectCall(i.inc, b.N)
    }

    func BenchmarkReflectOnceMethodCall(b *testing.B) {
    i := new(myint)
    incnReflectOnceCall(i.inc, b.N)
    }

    func BenchmarkStructMethodCall(b *testing.B) {
    i := new(myint)
    incnIntmethod(i, b.N)
    }

    func BenchmarkInterfaceMethodCall(b *testing.B) {
    i := new(myint)
    incnInterface(i, b.N)
    }

    func BenchmarkTypeSwitchMethodCall(b *testing.B) {
    i := new(myint)
    incnSwitch(i, b.N)
    }

    func BenchmarkTypeAssertionMethodCall(b *testing.B) {
    i := new(myint)
    incnAssertion(i, b.N)
    }

    func incnReflectCall(v interface{}, n int) {
    for k := 0; k < n; k++ {
    reflect.ValueOf(v).Call(nil)
    }
    }

    func incnReflectOnceCall(v interface{}, n int) {
    fn := reflect.ValueOf(v)
    for k := 0; k < n; k++ {
    fn.Call(nil)
    }
    }

    func incnIntmethod(i *myint, n int) {
    for k := 0; k < n; k++ {
    i.inc()
    }
    }

    func incnInterface(any Inccer, n int) {
    for k := 0; k < n; k++ {
    any.inc()
    }
    }

    func incnSwitch(any Inccer, n int) {
    for k := 0; k < n; k++ {
    switch v := any.(type) {
    case *myint:
    v.inc()
    }
    }
    }

    func incnAssertion(any Inccer, n int) {
    for k := 0; k < n; k++ {
    if newint, ok := any.(*myint); ok {
    newint.inc()
    }
    }
    }