Login light
// Copyright © 2016 Alan A. A. Donovan & Brian W. Kernighan.
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/

package cake_test

import (
    "testing"
    "time"

    "gopl.io/ch8/cake"
)

var defaults = cake.Shop{
    Verbose:      testing.Verbose(),
    Cakes:        20,
    BakeTime:     10 * time.Millisecond,
    NumIcers:     1,
    IceTime:      10 * time.Millisecond,
    InscribeTime: 10 * time.Millisecond,
}

func Benchmark(b *testing.B) {
    // Baseline: one baker, one icer, one inscriber.
    // Each step takes exactly 10ms.  No buffers.
    cakeshop := defaults
    cakeshop.Work(b.N) // 224 ms
}

func BenchmarkBuffers(b *testing.B) {
    // Adding buffers has no effect.
    cakeshop := defaults
    cakeshop.BakeBuf = 10
    cakeshop.IceBuf = 10
    cakeshop.Work(b.N) // 224 ms
}

func BenchmarkVariable(b *testing.B) {
    // Adding variability to rate of each step
    // increases total time due to channel delays.
    cakeshop := defaults
    cakeshop.BakeStdDev = cakeshop.BakeTime / 4
    cakeshop.IceStdDev = cakeshop.IceTime / 4
    cakeshop.InscribeStdDev = cakeshop.InscribeTime / 4
    cakeshop.Work(b.N) // 259 ms
}

func BenchmarkVariableBuffers(b *testing.B) {
    // Adding channel buffers reduces
    // delays resulting from variability.
    cakeshop := defaults
    cakeshop.BakeStdDev = cakeshop.BakeTime / 4
    cakeshop.IceStdDev = cakeshop.IceTime / 4
    cakeshop.InscribeStdDev = cakeshop.InscribeTime / 4
    cakeshop.BakeBuf = 10
    cakeshop.IceBuf = 10
    cakeshop.Work(b.N) // 244 ms
}

func BenchmarkSlowIcing(b *testing.B) {
    // Making the middle stage slower
    // adds directly to the critical path.
    cakeshop := defaults
    cakeshop.IceTime = 50 * time.Millisecond
    cakeshop.Work(b.N) // 1.032 s
}

func BenchmarkSlowIcingManyIcers(b *testing.B) {
    // Adding more icing cooks reduces the cost of icing
    // to its sequential component, following Amdahl's Law.
    cakeshop := defaults
    cakeshop.IceTime = 50 * time.Millisecond
    cakeshop.NumIcers = 5
    cakeshop.Work(b.N) // 288ms
}