reduce runtime.convT2I -> runtime.newobject -> runtime.mallocgc
conversion from value to interface is more expensive than
conversion from pointer to interface.
package main
import "testing"
type I interface {
String() string
}
type val struct {
s string
}
func (v val) String() string { return v.s }
type ptr struct {
s string
}
func (p *ptr) String() string { return p.s }
func BenchmarkT2IForValue(b *testing.B) {
var intf I
for i := 0; i < b.N; i++ {
intf = val{"abc"}
}
_ = intf
}
func BenchmarkT2IForPtr(b *testing.B) {
var intf I
for i := 0; i < b.N; i++ {
intf = &ptr{"abc"}
}
_ = intf
}
% go test -bench . a_test.go
testing: warning: no tests to run
PASS
BenchmarkT2IForValue 20000000 90.9 ns/op
BenchmarkT2IForPtr 20000000 76.8 ns/op
ok command-line-arguments 3.539s
diff --git a/expr_test.go b/expr_test.go
index dbf715a..9b776e0 100644
--- a/expr_test.go
+++ b/expr_test.go
@@ -47,11 +47,11 @@
},
{
in: "$foo",
- val: Expr{varref{varname: literal("f")}, literal("oo")},
+ val: Expr{&varref{varname: literal("f")}, literal("oo")},
},
{
in: "$(foo)",
- val: varref{varname: literal("foo")},
+ val: &varref{varname: literal("foo")},
},
{
in: "$(foo:.c=.o)",
@@ -68,13 +68,13 @@
fclosure: fclosure{
args: []Value{
literal("(subst"),
- varref{
+ &varref{
varname: literal("space"),
},
- varref{
+ &varref{
varname: literal(","),
},
- varref{
+ &varref{
varname: literal("foo"),
},
},
@@ -89,15 +89,15 @@
fclosure: fclosure{
args: []Value{
literal("(subst"),
- varref{
+ &varref{
varname: literal("space"),
},
- varref{
+ &varref{
varname: literal(""),
},
Expr{
literal(","),
- varref{
+ &varref{
varname: literal("foo"),
},
},
@@ -183,10 +183,10 @@
fclosure: fclosure{
args: []Value{
literal("(and"),
- varref{
+ &varref{
varname: literal("TRUE"),
},
- varref{
+ &varref{
varname: literal("X"),
},
},
@@ -245,7 +245,7 @@
val: &funcEvalAssign{
lhs: "foo",
op: ":=",
- rhs: varref{
+ rhs: &varref{
literal("bar"),
},
},