golang Go Performance analysis TODO
OLD CODE
package utils
import (
"fmt"
"log"
"os"
)
var numKeys int
var keys string
func Generate(totalKeys int) {
characters := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
file, err := os.Create("combinations.txt")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
defer file.Close()
// Generate all combinations of length 6
generateCombinations(characters, 6, "", file, totalKeys)
}
func generateCombinations(characters string, length int, current string, file *os.File, n int) {
if numKeys >= n {
_, err := file.WriteString(current + "\n")
if err != nil {
fmt.Println("Error writing to file:", err)
}
return
}
if len(current) == length {
keys += current + "\n"
if len(keys) > 64000 {
_, err := file.WriteString(keys + "\n")
if err != nil {
log.Fatalf("Error writing to file: %v", err)
}
keys = ""
}
numKeys += 1
return
}
for _, char := range characters {
generateCombinations(characters, length, current+string(char), file, n)
}
}
New Code (Much faster)
package utils
import (
"log"
"os"
)
var numKeys int
var buffer []byte
func Generate(totalKeys int) {
characters := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
file, err := os.Create("combinations.txt")
if err != nil {
log.Fatalf("Error creating file: %v", err)
}
defer file.Close()
// Generate all combinations of length 6
generateCombinations(characters, 6, []byte{}, file, totalKeys)
// Write remaining buffer (if any)
if len(buffer) > 0 {
file.Write(buffer)
}
}
func generateCombinations(characters string, length int, current []byte, file *os.File, n int) {
if numKeys >= n {
return
}
if len(current) == length {
buffer = append(buffer, current...)
buffer = append(buffer, '\n')
numKeys++
// Write if buffer exceeds 64KB
if len(buffer) > 64000 {
_, err := file.Write(buffer)
if err != nil {
log.Fatalf("Error writing to file: %v", err)
}
buffer = buffer[:0] // Reset buffer without reallocation
}
return
}
for i := 0; i < len(characters); i++ {
current = append(current, characters[i])
generateCombinations(characters, length, current, file, n)
current = current[:len(current)-1] // Backtrack
}
}
GPT Analysis
✅ Reduced GC pressure → fewer heap allocations with []byte
instead of string
✅ Minimized syscalls → batched writes reduce I/O cost
✅ Fixed early exit condition → no wasted computation
✅ More efficient backtracking → avoids creating new strings