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