// Week 4 – String += in a loop vs strings.Builder
// Run: go run ./w04/builder
package main

import (
	"fmt"
	"strings"
	"time"
)

// Every += creates a new string and copies the old one: O(n²)
func concatPlus(n int) string {
	s := ""
	for i := 0; i < n; i++ {
		s += "x"
	}
	return s
}

// strings.Builder: a dynamic byte array, amortized O(1) append
func concatBuilder(n int) string {
	var sb strings.Builder
	for i := 0; i < n; i++ {
		sb.WriteString("x")
	}
	return sb.String()
}

func main() {
	fmt.Println("        n   string += (ms)   strings.Builder (ms)")
	for n := 10_000; n <= 160_000; n *= 2 {
		t0 := time.Now()
		concatPlus(n)
		t1 := time.Now()
		concatBuilder(n)
		t2 := time.Now()
		fmt.Printf("%9d %16.1f %22.2f\n", n,
			float64(t1.Sub(t0).Microseconds())/1000, float64(t2.Sub(t1).Microseconds())/1000)
	}
}
