diff --git a/benchmark/primitives/context_test.go b/benchmark/primitives/context_test.go
new file mode 100644
index 0000000..e1d6c04
--- /dev/null
+++ b/benchmark/primitives/context_test.go
@@ -0,0 +1,120 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package primitives_test
+
+import (
+	"testing"
+	"time"
+
+	"golang.org/x/net/context"
+)
+
+func BenchmarkCancelContextErrNoErr(b *testing.B) {
+	ctx, cancel := context.WithCancel(context.Background())
+	for i := 0; i < b.N; i++ {
+		if err := ctx.Err(); err != nil {
+			b.Fatal("error")
+		}
+	}
+	cancel()
+}
+
+func BenchmarkCancelContextErrGotErr(b *testing.B) {
+	ctx, cancel := context.WithCancel(context.Background())
+	cancel()
+	for i := 0; i < b.N; i++ {
+		if err := ctx.Err(); err == nil {
+			b.Fatal("error")
+		}
+	}
+}
+
+func BenchmarkCancelContextChannelNoErr(b *testing.B) {
+	ctx, cancel := context.WithCancel(context.Background())
+	for i := 0; i < b.N; i++ {
+		select {
+		case <-ctx.Done():
+			b.Fatal("error: ctx.Done():", ctx.Err())
+		default:
+		}
+	}
+	cancel()
+}
+
+func BenchmarkCancelContextChannelGotErr(b *testing.B) {
+	ctx, cancel := context.WithCancel(context.Background())
+	cancel()
+	for i := 0; i < b.N; i++ {
+		select {
+		case <-ctx.Done():
+			if err := ctx.Err(); err == nil {
+				b.Fatal("error")
+			}
+		default:
+			b.Fatal("error: !ctx.Done()")
+		}
+	}
+}
+
+func BenchmarkTimerContextErrNoErr(b *testing.B) {
+	ctx, cancel := context.WithTimeout(context.Background(), 24*time.Hour)
+	for i := 0; i < b.N; i++ {
+		if err := ctx.Err(); err != nil {
+			b.Fatal("error")
+		}
+	}
+	cancel()
+}
+
+func BenchmarkTimerContextErrGotErr(b *testing.B) {
+	ctx, cancel := context.WithTimeout(context.Background(), time.Microsecond)
+	cancel()
+	for i := 0; i < b.N; i++ {
+		if err := ctx.Err(); err == nil {
+			b.Fatal("error")
+		}
+	}
+}
+
+func BenchmarkTimerContextChannelNoErr(b *testing.B) {
+	ctx, cancel := context.WithTimeout(context.Background(), 24*time.Hour)
+	for i := 0; i < b.N; i++ {
+		select {
+		case <-ctx.Done():
+			b.Fatal("error: ctx.Done():", ctx.Err())
+		default:
+		}
+	}
+	cancel()
+}
+
+func BenchmarkTimerContextChannelGotErr(b *testing.B) {
+	ctx, cancel := context.WithTimeout(context.Background(), time.Microsecond)
+	cancel()
+	for i := 0; i < b.N; i++ {
+		select {
+		case <-ctx.Done():
+			if err := ctx.Err(); err == nil {
+				b.Fatal("error")
+			}
+		default:
+			b.Fatal("error: !ctx.Done()")
+		}
+	}
+}
