]> Cypherpunks repositories - gostls13.git/commit
cmd/gc: evaluate concrete == interface without allocating
authorJosh Bleecher Snyder <josharian@gmail.com>
Wed, 24 Dec 2014 02:28:02 +0000 (18:28 -0800)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 12 Feb 2015 22:23:38 +0000 (22:23 +0000)
commit77a2113925b516c0ead2ae258c4d41ac3fdc0836
tree9dce58ccff89194921957f0023c9c35a784cea29
parent747c8498339b799eb613db1701a927a3549d389a
cmd/gc: evaluate concrete == interface without allocating

Consider an interface value i of type I and concrete value c of type C.

Prior to this CL, i==c was evaluated as
I(c) == i

Evaluating I(c) can allocate.

This CL changes the evaluation of i==c to
x, ok := i.(C); ok && x == c

The new generated code is shorter and does not allocate directly.

If C is small, as it is in every instance in the stdlib,
the new code also uses less stack space
and makes one runtime call instead of two.

If C is very large, the original implementation is used.
The cutoff for "very large" is 1<<16,
following the stack vs heap cutoff used elsewhere.

This kind of comparison occurs in 38 places in the stdlib,
mostly in the net and os packages.

benchmark                     old ns/op     new ns/op     delta
BenchmarkEqEfaceConcrete      29.5          7.92          -73.15%
BenchmarkEqIfaceConcrete      32.1          7.90          -75.39%
BenchmarkNeEfaceConcrete      29.9          7.90          -73.58%
BenchmarkNeIfaceConcrete      35.9          7.90          -77.99%

Fixes #9370.

Change-Id: I7c4555950bcd6406ee5c613be1f2128da2c9a2b7
Reviewed-on: https://go-review.googlesource.com/2096
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/gc/typecheck.c
src/cmd/gc/walk.c
src/runtime/iface_test.go
test/fixedbugs/issue9370.go [new file with mode: 0644]
test/live.go