---
title: "About the Benchmarking Process"
linkTitle: "About the Benchmarking Process"
weight: 1
---

## What's the difference between the four images?
In the benchmarking charts you'll see four images: Few Large Layers, Few Small Layers, Many Large Layers, and Many Small Layers

All the images use the same base image: `gcr.io/buildpacks/builder:v1`

#### Few vs Many
Few will copy two files while many will copy 20 files.

#### Small vs Large
Small will copy a 20MB file while large will copy a 123MB file.

Using this info you can see the following:
- Few Large Layers: copies two 123MB files
- Few Small Layers: copies two 20MB files
- Many Large Layers: copies 20 123MB files
- Many Small Layers: copies 20 20MB files

Finally, as the last layer, a simplistic 11 line Go app is copied in.

## Iterative vs Initial
There are two graphs for each benchmark, iterative and initial.

#### Initial
Initial simulates loading the image for the first time.

All existing images and cache is removed/cleared from minikube and Docker between runs to replicate what the user would experience when loading for the first time.

#### Iterative
Iterative simulates only the Go app (last layer of the image) changing.

This is the exact use case of [Skaffold](https://github.com/GoogleContainerTools/skaffold), where if the user changes a file the Go binary is rebuilt and the image is re-loaded.

Between runs the cache and existing image is left alone, only the Go binary is changed.


## How are the benchmarks conducted?
```
// Pseudo code of running docker-env benchmark

startMinikube() // minikube start --container-runtime=docker

for image in [fewLargeLayers, fewSmallLayers, ...] {
	buildGoBinary()

	// initial simulation
	for i in runCount {
		startTimer()

		runDockerEnvImageLoad(image)

		stopTimer()

		verifyImageSuccessfullyLoaded()

		storeTimeTaken()

		removeImage()

		clearDockerCache()
	}

	// iterative simulation
	for i in runCount {
		updateGoBinary()

		startTimer()

		runDockerEnvImageLoad(image)

		stopTimer()

		verifyImageSuccessfullyLoaded()

		storeTimeTaken() // skip if first run
	}

	clearDockerCache()

	calculateAndRecordAverageTime()
}

deleteMinikube() // minkube delete --all
```
