aboutsummaryrefslogtreecommitdiff
path: root/serialize.go
diff options
context:
space:
mode:
authorFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-06-18 15:36:57 +0900
committerFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-06-18 15:36:57 +0900
commitb8acae94bc5b6494f51fe1acf32df5d72d412562 (patch)
treec0e114c693abdacc5690ec3adf8dd1161c8983d1 /serialize.go
parent7c9aa9f17d5f8f27aed62b5520b8fbc6be0103ac (diff)
downloadkati-b8acae94bc5b6494f51fe1acf32df5d72d412562.tar.gz
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
Diffstat (limited to 'serialize.go')
-rw-r--r--serialize.go8
1 files changed, 4 insertions, 4 deletions
diff --git a/serialize.go b/serialize.go
index da8b0b5..4ee0b29 100644
--- a/serialize.go
+++ b/serialize.go
@@ -321,7 +321,7 @@ func DeserializeVar(sv SerializableVar) (r Value) {
}
return e
case "varref":
- return varref{varname: DeserializeSingleChild(sv)}
+ return &varref{varname: DeserializeSingleChild(sv)}
case "paramref":
v, err := strconv.Atoi(sv.V)
if err != nil {
@@ -353,18 +353,18 @@ func DeserializeVar(sv SerializableVar) (r Value) {
return &funcNop{expr: sv.V}
case "simple":
- return SimpleVar{
+ return &SimpleVar{
value: []byte(sv.V),
origin: sv.Origin,
}
case "recursive":
- return RecursiveVar{
+ return &RecursiveVar{
expr: DeserializeSingleChild(sv),
origin: sv.Origin,
}
case ":=", "=", "+=", "?=":
- return TargetSpecificVar{
+ return &TargetSpecificVar{
v: DeserializeSingleChild(sv).(Var),
op: sv.Type,
}