From 463a16af36b4b8f8342f4cf98a1f13f55fcc561a Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Thu, 18 Sep 2014 21:27:33 -0400 Subject: [PATCH] Add benchmarks for API tests --- hack/benchmark-go.sh | 19 ++++++++++++ pkg/api/serialization_test.go | 56 +++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100755 hack/benchmark-go.sh diff --git a/hack/benchmark-go.sh b/hack/benchmark-go.sh new file mode 100755 index 00000000000..cdbe420f83d --- /dev/null +++ b/hack/benchmark-go.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Copyright 2014 Google Inc. All rights reserved. +# +# 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. + +set -e + +KUBE_COVER=" " KUBE_RACE=" " hack/test-go.sh "" -test.run="^X" -benchtime=1s -bench=. -benchmem \ No newline at end of file diff --git a/pkg/api/serialization_test.go b/pkg/api/serialization_test.go index 3203eccc2fe..a464c0d96c4 100644 --- a/pkg/api/serialization_test.go +++ b/pkg/api/serialization_test.go @@ -17,7 +17,9 @@ limitations under the License. package api_test import ( + "encoding/json" "flag" + "math/rand" "reflect" "testing" @@ -203,3 +205,57 @@ func TestBadJSONRejection(t *testing.T) { t.Errorf("Kind is set but doesn't match the object type: %s", badJSONKindMismatch) }*/ } + +const benchmarkSeed = 100 + +func BenchmarkEncode(b *testing.B) { + pod := api.Pod{} + apiObjectFuzzer.RandSource(rand.NewSource(benchmarkSeed)) + apiObjectFuzzer.Fuzz(&pod) + for i := 0; i < b.N; i++ { + latest.Codec.Encode(&pod) + } +} + +// BenchmarkEncodeJSON provides a baseline for regular JSON encode performance +func BenchmarkEncodeJSON(b *testing.B) { + pod := api.Pod{} + apiObjectFuzzer.RandSource(rand.NewSource(benchmarkSeed)) + apiObjectFuzzer.Fuzz(&pod) + for i := 0; i < b.N; i++ { + json.Marshal(&pod) + } +} + +func BenchmarkDecode(b *testing.B) { + pod := api.Pod{} + apiObjectFuzzer.RandSource(rand.NewSource(benchmarkSeed)) + apiObjectFuzzer.Fuzz(&pod) + data, _ := latest.Codec.Encode(&pod) + for i := 0; i < b.N; i++ { + latest.Codec.Decode(data) + } +} + +func BenchmarkDecodeInto(b *testing.B) { + pod := api.Pod{} + apiObjectFuzzer.RandSource(rand.NewSource(benchmarkSeed)) + apiObjectFuzzer.Fuzz(&pod) + data, _ := latest.Codec.Encode(&pod) + for i := 0; i < b.N; i++ { + obj := api.Pod{} + latest.Codec.DecodeInto(data, &obj) + } +} + +// BenchmarkDecodeJSON provides a baseline for regular JSON decode performance +func BenchmarkDecodeJSON(b *testing.B) { + pod := api.Pod{} + apiObjectFuzzer.RandSource(rand.NewSource(benchmarkSeed)) + apiObjectFuzzer.Fuzz(&pod) + data, _ := latest.Codec.Encode(&pod) + for i := 0; i < b.N; i++ { + obj := api.Pod{} + json.Unmarshal(data, &obj) + } +}