diff --git a/proto/decode_test.go b/proto/decode_test.go
new file mode 100644
index 0000000..719fffd
--- /dev/null
+++ b/proto/decode_test.go
@@ -0,0 +1,216 @@
+// Go support for Protocol Buffers - Google's data interchange format
+//
+// Copyright 2010 The Go Authors.  All rights reserved.
+// https://github.com/golang/protobuf
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package proto_test
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/golang/protobuf/proto"
+	tpb "github.com/golang/protobuf/proto/proto3_proto"
+)
+
+var (
+	bytesBlackhole []byte
+	msgBlackhole   = new(tpb.Message)
+)
+
+func BenchmarkVarint32ArraySmall(b *testing.B) {
+	for i := uint(1); i <= 10; i++ {
+		dist := genInt32Dist([7]int{0, 3, 1}, 1<<i)
+		raw, err := proto.Marshal(&tpb.Message{
+			ShortKey: dist,
+		})
+		if err != nil {
+			b.Error("wrong encode", err)
+		}
+		b.Run(fmt.Sprintf("Len%v", len(dist)), func(b *testing.B) {
+			scratchBuf := proto.NewBuffer(nil)
+			b.ResetTimer()
+			for k := 0; k < b.N; k++ {
+				scratchBuf.SetBuf(raw)
+				msgBlackhole.Reset()
+				if err := scratchBuf.Unmarshal(msgBlackhole); err != nil {
+					b.Error("wrong decode", err)
+				}
+			}
+		})
+	}
+}
+
+func BenchmarkVarint32ArrayLarge(b *testing.B) {
+	for i := uint(1); i <= 10; i++ {
+		dist := genInt32Dist([7]int{0, 1, 2, 4, 8, 1, 1}, 1<<i)
+		raw, err := proto.Marshal(&tpb.Message{
+			ShortKey: dist,
+		})
+		if err != nil {
+			b.Error("wrong encode", err)
+		}
+		b.Run(fmt.Sprintf("Len%v", len(dist)), func(b *testing.B) {
+			scratchBuf := proto.NewBuffer(nil)
+			b.ResetTimer()
+			for k := 0; k < b.N; k++ {
+				scratchBuf.SetBuf(raw)
+				msgBlackhole.Reset()
+				if err := scratchBuf.Unmarshal(msgBlackhole); err != nil {
+					b.Error("wrong decode", err)
+				}
+			}
+		})
+	}
+}
+
+func BenchmarkVarint64ArraySmall(b *testing.B) {
+	for i := uint(1); i <= 10; i++ {
+		dist := genUint64Dist([11]int{0, 3, 1}, 1<<i)
+		raw, err := proto.Marshal(&tpb.Message{
+			Key: dist,
+		})
+		if err != nil {
+			b.Error("wrong encode", err)
+		}
+		b.Run(fmt.Sprintf("Len%v", len(dist)), func(b *testing.B) {
+			scratchBuf := proto.NewBuffer(nil)
+			b.ResetTimer()
+			for k := 0; k < b.N; k++ {
+				scratchBuf.SetBuf(raw)
+				msgBlackhole.Reset()
+				if err := scratchBuf.Unmarshal(msgBlackhole); err != nil {
+					b.Error("wrong decode", err)
+				}
+			}
+		})
+	}
+}
+
+func BenchmarkVarint64ArrayLarge(b *testing.B) {
+	for i := uint(1); i <= 10; i++ {
+		dist := genUint64Dist([11]int{0, 1, 1, 2, 4, 8, 16, 32, 16, 1, 1}, 1<<i)
+		raw, err := proto.Marshal(&tpb.Message{
+			Key: dist,
+		})
+		if err != nil {
+			b.Error("wrong encode", err)
+		}
+		b.Run(fmt.Sprintf("Len%v", len(dist)), func(b *testing.B) {
+			scratchBuf := proto.NewBuffer(nil)
+			b.ResetTimer()
+			for k := 0; k < b.N; k++ {
+				scratchBuf.SetBuf(raw)
+				msgBlackhole.Reset()
+				if err := scratchBuf.Unmarshal(msgBlackhole); err != nil {
+					b.Error("wrong decode", err)
+				}
+			}
+		})
+	}
+}
+
+// genInt32Dist generates a slice of ints that will match the size distribution of dist.
+// A size of 6 corresponds to a max length varint32, which is 10 bytes.  The distribution
+// is 1-indexed. (i.e. the value at index 1 is how many 1 byte ints to create).
+func genInt32Dist(dist [7]int, count int) (dest []int32) {
+	for i := 0; i < count; i++ {
+		for k := 0; k < len(dist); k++ {
+			var num int32
+			switch k {
+			case 1:
+				num = 1<<7 - 1
+			case 2:
+				num = 1<<14 - 1
+			case 3:
+				num = 1<<21 - 1
+			case 4:
+				num = 1<<28 - 1
+			case 5:
+				num = 1<<29 - 1
+			case 6:
+				num = -1
+			}
+			for m := 0; m < dist[k]; m++ {
+				dest = append(dest, num)
+			}
+		}
+	}
+	return
+}
+
+// genUint64Dist generates a slice of ints that will match the size distribution of dist.
+// The distribution is 1-indexed. (i.e. the value at index 1 is how many 1 byte ints to create).
+func genUint64Dist(dist [11]int, count int) (dest []uint64) {
+	for i := 0; i < count; i++ {
+		for k := 0; k < len(dist); k++ {
+			var num uint64
+			switch k {
+			case 1:
+				num = 1<<7 - 1
+			case 2:
+				num = 1<<14 - 1
+			case 3:
+				num = 1<<21 - 1
+			case 4:
+				num = 1<<28 - 1
+			case 5:
+				num = 1<<35 - 1
+			case 6:
+				num = 1<<42 - 1
+			case 7:
+				num = 1<<49 - 1
+			case 8:
+				num = 1<<56 - 1
+			case 9:
+				num = 1<<63 - 1
+			case 10:
+				num = 1<<64 - 1
+			}
+			for m := 0; m < dist[k]; m++ {
+				dest = append(dest, num)
+			}
+		}
+	}
+	return
+}
+
+// BenchmarkDecodeEmpty measures the overhead of doing the minimal possible decode.
+func BenchmarkDecodeEmpty(b *testing.B) {
+	raw, err := proto.Marshal(&tpb.Message{})
+	if err != nil {
+		b.Error("wrong encode", err)
+	}
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		if err := proto.Unmarshal(raw, msgBlackhole); err != nil {
+			b.Error("wrong decode", err)
+		}
+	}
+}
diff --git a/proto/proto3_proto/proto3.proto b/proto/proto3_proto/proto3.proto
index 3e9a1ab..75d5a02 100644
--- a/proto/proto3_proto/proto3.proto
+++ b/proto/proto3_proto/proto3.proto
@@ -53,6 +53,7 @@
   float score = 9;
 
   repeated uint64 key = 5;
+  repeated int32 short_key = 19;
   Nested nested = 6;
   repeated Humour r_funny = 16;
 
@@ -62,6 +63,9 @@
 
   google.protobuf.Any anything = 14;
   repeated google.protobuf.Any many_things = 15;
+
+  Message submessage = 17;
+  repeated Message children = 18;
 }
 
 message Nested {
