package main
import (
"fmt"
"sync"
"time"
"runtime"
)
var mu sync.Mutex
var mem runtime.MemStats
func main() {
imap()
iarray()
ipreSlice()
islice()
}
func _green(text string) {
fmt.Fprintf(color.Output, color.GreenString(text))
fmt.Println()
}
func imap() {
_green("Map Implementation")
cache := make(map[int]int, 1000000)
start := time.Now()
for i := 0; i < 1000000; i++ {
mu.Lock()
cache[i] = i
mu.Unlock()
}
end := time.Since(start)
fmt.Printf("Latency: %v \n", end)
var sum int64
for _, v := range cache {
sum += int64(v)
}
fmt.Printf("Checksum: %v \n", sum)
printHeap()
printStack()
}
func iarray() {
_green("Array Implementation")
cache := [1000000]int{}
start := time.Now()
for i := 0; i < 1000000; i++ {
mu.Lock()
cache[i] = i
mu.Unlock()
}
end := time.Since(start)
fmt.Printf("Latency: %v \n", end)
var sum int64
for _, v := range cache {
sum += int64(v)
}
fmt.Printf("Checksum: %v \n", sum)
printHeap()
printStack()
}
func ipreSlice() {
_green("Preallocated Slice Implementation")
cache := make([]int, 1000000)
start := time.Now()
for i := 0; i < 1000000; i++ {
mu.Lock()
cache[i] = i
mu.Unlock()
}
end := time.Since(start)
fmt.Printf("Latency: %v \n", end)
var sum int64
for _, v := range cache {
sum += int64(v)
}
fmt.Printf("Checksum: %v \n", sum)
printHeap()
printStack()
}
func islice() {
_green("Slice Implementation")
cache := []int{}
start := time.Now()
for i := 0; i < 1000000; i++ {
mu.Lock()
cache = append(cache, i)
mu.Unlock()
}
end := time.Since(start)
fmt.Printf("Latency: %v \n", end)
var sum int64
for _, v := range cache {
sum += int64(v)
}
fmt.Printf("Checksum: %v \n", sum)
printHeap()
printStack()
}
func printHeap() {
runtime.ReadMemStats(&mem)
fmt.Printf("Heap: %v MB", float64(mem.HeapInuse)/1024/1024)
fmt.Println()
}
func printStack() {
runtime.ReadMemStats(&mem)
fmt.Printf("Stack: %v MB", float64(mem.StackInuse)/1024/1024)
fmt.Println()
fmt.Println()
}