mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
gc: optimize interface ==, !=
If the values being compared have different concrete types, then they're clearly unequal without needing to invoke the actual interface compare routine. This speeds tests for specific values, like if err == io.EOF, by about 3x. benchmark old ns/op new ns/op delta BenchmarkIfaceCmp100 843 287 -65.95% BenchmarkIfaceCmpNil100 184 182 -1.09% Fixes #2591. R=ken2 CC=golang-dev https://golang.org/cl/5651073
This commit is contained in:
parent
a7b83f2287
commit
f91cc3bdbb
10 changed files with 150 additions and 5 deletions
40
src/pkg/runtime/runtime_test.go
Normal file
40
src/pkg/runtime/runtime_test.go
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright 2012 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package runtime_test
|
||||
|
||||
import (
|
||||
"io"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var errf error
|
||||
|
||||
func errfn() error {
|
||||
return errf
|
||||
}
|
||||
|
||||
func errfn1() error {
|
||||
return io.EOF
|
||||
}
|
||||
|
||||
func BenchmarkIfaceCmp100(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
for j := 0; j < 100; j++ {
|
||||
if errfn() == io.EOF {
|
||||
b.Fatal("bad comparison")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkIfaceCmpNil100(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
for j := 0; j < 100; j++ {
|
||||
if errfn1() == nil {
|
||||
b.Fatal("bad comparison")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue