diff --git a/.travis.yml b/.travis.yml index 8ce19f688f0..b0383b0558f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ script: - KUBE_TIMEOUT='-timeout 60s' ./hack/test-go.sh - PATH=$HOME/gopath/bin:./third_party/etcd/bin:$PATH ./hack/test-cmd.sh - PATH=$HOME/gopath/bin:./third_party/etcd/bin:$PATH ./hack/test-integration.sh + - ./hack/benchmark-go.sh notifications: irc: "chat.freenode.net#google-containers" 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/hack/test-go.sh b/hack/test-go.sh index 015d1098f6d..aaca6b61d13 100755 --- a/hack/test-go.sh +++ b/hack/test-go.sh @@ -47,6 +47,7 @@ find_test_pkgs() { # -covermode=atomic becomes default with -race in Go >=1.3 KUBE_COVER=${KUBE_COVER:--cover -covermode=atomic} KUBE_TIMEOUT=${KUBE_TIMEOUT:--timeout 60s} +KUBE_RACE=${KUBE_RACE:--race} cd "${KUBE_TARGET}" @@ -121,7 +122,7 @@ if [[ "${iterations}" -gt 1 ]]; then count=0 for i in $(seq 1 ${iterations}); do if go test "${goflags[@]:+${goflags[@]}}" \ - -race ${KUBE_TIMEOUT} "${pkg}"; then + ${KUBE_RACE} ${KUBE_TIMEOUT} "${pkg}"; then pass=$((pass + 1)) else fails=$((fails + 1)) @@ -145,7 +146,7 @@ if [[ -n "$1" ]]; then mkdir -p "${covdir}/${arg}" pkg=${KUBE_GO_PACKAGE}/${arg} go test "${goflags[@]:+${goflags[@]}}" \ - -race \ + ${KUBE_RACE} \ ${KUBE_TIMEOUT} \ ${KUBE_COVER} -coverprofile="${covdir}/${arg}/coverage.out" \ "${pkg}" @@ -154,6 +155,6 @@ if [[ -n "$1" ]]; then fi find_test_pkgs | xargs go test "${goflags[@]:+${goflags[@]}}" \ - -race \ + ${KUBE_RACE} \ ${KUBE_TIMEOUT} \ ${KUBE_COVER} 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) + } +}