Added benchmarks for 'ToXX' vs 'To[T type]'

They show some weird numbers considering the 'On' benchmarks
This commit is contained in:
Marius Orcsik 2022-06-04 19:19:30 +02:00
parent 6917e06269
commit 697681d8d4
No known key found for this signature in database
GPG key ID: DBF5E47F5DBC4D21
2 changed files with 55 additions and 8 deletions

View file

@ -323,16 +323,60 @@ func TestOn(t *testing.T) {
var fnObj = func(_ *Object) error {
return nil
}
var fnAct = func(_ *Actor) error {
return nil
}
var fnA = func(_ *Activity) error {
return nil
}
var fnIA = func(_ *IntransitiveActivity) error {
return nil
func Benchmark_ToT_vs_To_T(b *testing.B) {
maybeObject := Object{}
b.Run("ToObject", func(b *testing.B) {
for i := 0; i < b.N; i++ {
ToObject(maybeObject)
}
})
b.Run("To_T_Object", func(b *testing.B) {
for i := 0; i < b.N; i++ {
To[Object](maybeObject)
}
})
maybeActor := Actor{}
b.Run("ToActor", func(b *testing.B) {
for i := 0; i < b.N; i++ {
ToActor(maybeActor)
}
})
b.Run("To_T_Actor", func(b *testing.B) {
for i := 0; i < b.N; i++ {
To[Actor](maybeActor)
}
})
maybeActivity := Activity{}
b.Run("ToActivity", func(b *testing.B) {
for i := 0; i < b.N; i++ {
ToActivity(maybeActivity)
}
})
b.Run("To_T_Activity", func(b *testing.B) {
for i := 0; i < b.N; i++ {
To[Activity](maybeActivity)
}
})
maybeIntransitiveActivity := IntransitiveActivity{}
b.Run("ToIntransitiveActivity", func(b *testing.B) {
for i := 0; i < b.N; i++ {
ToIntransitiveActivity(maybeIntransitiveActivity)
}
})
b.Run("To_T_IntransitiveActivity", func(b *testing.B) {
for i := 0; i < b.N; i++ {
To[IntransitiveActivity](maybeIntransitiveActivity)
}
})
}
var (
fnAct = func(_ *Actor) error { return nil }
fnA = func(_ *Activity) error { return nil }
fnIA = func(_ *IntransitiveActivity) error { return nil }
)
func Benchmark_OnT_vs_On_T(b *testing.B) {
var it Item
b.Run("OnObject", func(b *testing.B) {

View file

@ -676,6 +676,9 @@ func ToObject(it Item) (*Object, error) {
// NOTE(marius): this is an ugly way of dealing with the interface conversion error: types from different scopes
typ := reflect.TypeOf(new(Object))
if reflect.TypeOf(it).ConvertibleTo(typ) {
if reflect.ValueOf(it).IsNil() {
return nil, nil
}
if i, ok := reflect.ValueOf(it).Convert(typ).Interface().(*Object); ok {
return i, nil
}