Skip to content

Instantly share code, notes, and snippets.

@febuiles
Created March 8, 2024 11:19
Show Gist options
  • Save febuiles/5f9c6bc73a7bbbd79322163a3d42c5b9 to your computer and use it in GitHub Desktop.
Save febuiles/5f9c6bc73a7bbbd79322163a3d42c5b9 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"math/rand"
"sort"
"time"
"github.com/emirpasic/gods/sets/treeset"
)
func generateRandomPath(length int) string {
const letters = "/abcdefghijklmnopqrstuvwxyz"
result := make([]byte, length)
for i := range result {
result[i] = letters[rand.Intn(len(letters))]
}
return string(result)
}
func main() {
rand.Seed(time.Now().UnixNano())
var paths []string
for i := 0; i < 1000; i++ {
pathLength := rand.Intn(50) + 1
paths = append(paths, generateRandomPath(pathLength))
}
pathsCopy := make([]string, len(paths))
copy(pathsCopy, paths)
// treeset
start := time.Now()
set := treeset.NewWith(func(a, b interface{}) int {
aStr, bStr := a.(string), b.(string)
aLen, bLen := len(aStr), len(bStr)
if aLen < bLen {
return -1
} else if aLen > bLen {
return 1
}
// length is equal, do alphabetical order
if aStr < bStr {
return -1
} else if aStr > bStr {
return 1
}
return 0
})
for _, path := range paths {
set.Add(path)
}
treeSetDuration := time.Since(start)
// "dumb sort"
start = time.Now()
sort.Slice(pathsCopy, func(i, j int) bool {
return len(pathsCopy[i]) < len(pathsCopy[j])
})
sliceSortDuration := time.Since(start)
fmt.Printf("treeset sorting took: %v\n", treeSetDuration)
fmt.Printf("dumb sorting took: %v\n", sliceSortDuration)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment