func benchmarkVariesContainerNumber(client *docker.Client) {
	cfg := variesContainerNumConfig
	deadContainers := cfg["dead"].([]int)
	aliveContainers := cfg["alive"].([]int)
	period := cfg["period"].(time.Duration)
	interval := cfg["interval"].(time.Duration)
	dead := deadContainers[0]
	alive := aliveContainers[0]
	ids := append(helpers.CreateDeadContainers(client, dead), helpers.CreateAliveContainers(client, alive)...)
	helpers.LogTitle("varies_container")
	helpers.LogEVar(map[string]interface{}{
		"period":   period,
		"interval": interval,
	})
	helpers.LogLabels("#dead", "#alive", "#total")
	for i, num := range append(deadContainers, aliveContainers...) {
		if i < len(deadContainers) {
			// Create more dead containers
			ids = append(ids, helpers.CreateDeadContainers(client, num-dead)...)
			dead = num
		} else {
			// Create more alive containers
			ids = append(ids, helpers.CreateAliveContainers(client, num-alive)...)
			alive = num
		}
		total := dead + alive
		latencies := helpers.DoListContainerBenchmark(client, interval, period, true, nil)
		helpers.LogResult(latencies, helpers.Itoas(dead, alive, total)...)
		latencies = helpers.DoListContainerBenchmark(client, interval, period, false, nil)
		helpers.LogResult(latencies, helpers.Itoas(dead, alive, total)...)
		latencies = helpers.DoInspectContainerBenchmark(client, interval, period, ids)
		helpers.LogResult(latencies, helpers.Itoas(dead, alive, total)...)
	}
}
func benchmarkVariesInterval(client *docker.Client) {
	alive := helpers.GetContainerNum(client, false)
	dead := helpers.GetContainerNum(client, true) - alive
	containerIds := helpers.GetContainerIds(client)
	cfg := variesIntervalConfig
	listIntervals := cfg["list interval"].([]time.Duration)
	listPeriod := cfg["list period"].(time.Duration)
	helpers.LogTitle("list_all")
	helpers.LogEVar(map[string]interface{}{
		"#alive": alive,
		"#dead":  dead,
		"all":    true,
		"period": listPeriod,
	})
	helpers.LogLabels("interval")
	for _, curInterval := range listIntervals {
		latencies := helpers.DoListContainerBenchmark(client, curInterval, listPeriod, true, nil)
		helpers.LogResult(latencies, helpers.Itoas(int(curInterval/time.Millisecond))...)
	}

	helpers.LogTitle("list_alive")
	helpers.LogEVar(map[string]interface{}{
		"#alive": alive,
		"#dead":  dead,
		"all":    false,
		"period": listPeriod,
	})
	helpers.LogLabels("interval")
	for _, curInterval := range listIntervals {
		latencies := helpers.DoListContainerBenchmark(client, curInterval, listPeriod, false, nil)
		helpers.LogResult(latencies, helpers.Itoas(int(curInterval/time.Millisecond))...)
	}

	inspectIntervals := cfg["inspect interval"].([]time.Duration)
	inspectPeriod := cfg["inspect period"].(time.Duration)
	helpers.LogTitle("inspect")
	helpers.LogEVar(map[string]interface{}{
		"#alive": alive,
		"#dead":  dead,
		"period": inspectPeriod,
	})
	helpers.LogLabels("interval")
	for _, curInterval := range inspectIntervals {
		latencies := helpers.DoInspectContainerBenchmark(client, curInterval, inspectPeriod, containerIds)
		helpers.LogResult(latencies, helpers.Itoas(int(curInterval/time.Millisecond))...)
	}
}
func benchmarkVariesRoutineNumber(client *docker.Client) {
	alive := helpers.GetContainerNum(client, false)
	dead := helpers.GetContainerNum(client, true) - alive
	containerIds := helpers.GetContainerIds(client)
	cfg := variesRoutineNumConfig
	routines := cfg["routines"].([]int)
	period := cfg["period"].(time.Duration)

	listInterval := cfg["list interval"].(time.Duration)
	helpers.LogTitle("list_all")
	helpers.LogEVar(map[string]interface{}{
		"#alive":   alive,
		"#dead":    dead,
		"all":      true,
		"interval": listInterval,
		"period":   period,
	})
	helpers.LogLabels("#routines")
	for _, curRoutineNumber := range routines {
		latencies := helpers.DoParalListContainerBenchmark(client, listInterval, period, curRoutineNumber, true)
		helpers.LogResult(latencies, helpers.Itoas(curRoutineNumber)...)
	}

	inspectInterval := cfg["inspect interval"].(time.Duration)
	helpers.LogTitle("inspect")
	helpers.LogEVar(map[string]interface{}{
		"#alive":   alive,
		"#dead":    dead,
		"interval": inspectInterval,
		"period":   period,
	})
	helpers.LogLabels("#routines")
	for _, curRoutineNumber := range routines {
		latencies := helpers.DoParalInspectContainerBenchmark(client, inspectInterval, period, curRoutineNumber, containerIds)
		helpers.LogResult(latencies, helpers.Itoas(curRoutineNumber)...)
	}
}
func benchmarkContainerStart(client *docker.Client) {
	cfg := containerOpConfig
	period := cfg["period"].(time.Duration)
	routine := cfg["routine"].(int)
	helpers.LogTitle("container_op")
	helpers.LogEVar(map[string]interface{}{
		"period":  period,
		"routine": routine,
	})
	helpers.LogLabels("qps", "cps")
	for _, q := range cfg["qps"].([]float64) {
		start := time.Now()
		latencies := helpers.DoParalContainerStartBenchmark(client, q, period, routine)
		cps := float64(len(latencies)) / time.Now().Sub(start).Seconds()
		helpers.LogResult(latencies, helpers.Ftoas(q, cps)...)

		start = time.Now()
		latencies = helpers.DoParalContainerStopBenchmark(client, q, routine)
		cps = float64(len(latencies)) / time.Now().Sub(start).Seconds()
		helpers.LogResult(latencies, helpers.Ftoas(q, cps)...)
	}
}