Preallocate slices when possible, remove unnecessary check when sortOrder is provided

This commit is contained in:
Seednode 2023-02-18 13:00:08 -06:00
parent e638e2709a
commit d05550a991
3 changed files with 23 additions and 39 deletions

View File

@ -52,7 +52,7 @@ type Dimensions struct {
} }
type Files struct { type Files struct {
mutex sync.Mutex mutex sync.RWMutex
list map[string][]string list map[string][]string
} }
@ -448,7 +448,7 @@ func fileList(paths []string, filters *Filters, sort string, index *Index) ([]st
var fileList []string var fileList []string
files := &Files{ files := &Files{
mutex: sync.Mutex{}, mutex: sync.RWMutex{},
list: make(map[string][]string), list: make(map[string][]string),
} }
@ -505,45 +505,27 @@ func fileList(paths []string, filters *Filters, sort string, index *Index) ([]st
return fileList, false return fileList, false
} }
func cleanFilename(filename string) string {
return filename[:len(filename)-(len(filepath.Ext(filename))+3)]
}
func prepareDirectory(directory []string) []string {
_, first := filepath.Split(directory[0])
first = cleanFilename(first)
_, last := filepath.Split(directory[len(directory)-1])
last = cleanFilename(last)
if first == last {
return append([]string{}, directory[0])
} else {
return directory
}
}
func prepareDirectories(files *Files, sort string) []string { func prepareDirectories(files *Files, sort string) []string {
directories := []string{} i, l := 0, 0
files.mutex.RLock()
keys := make([]string, len(files.list)) keys := make([]string, len(files.list))
i := 0
for k := range files.list { for k := range files.list {
keys[i] = k keys[i] = k
i++ i++
l += len(files.list[k])
} }
if sort == "asc" || sort == "desc" { directories := make([]string, l)
for i := 0; i < len(keys); i++ { for i := 0; i < len(keys); i++ {
directories = append(directories, prepareDirectory(files.list[keys[i]])...) copy(directories, files.list[keys[i]])
}
} else {
for i := 0; i < len(keys); i++ {
directories = append(directories, files.list[keys[i]]...)
}
} }
files.mutex.RUnlock()
return directories return directories
} }
@ -586,7 +568,7 @@ func pickFile(args []string, filters *Filters, sort string, index *Index) (strin
} }
func normalizePaths(args []string) ([]string, error) { func normalizePaths(args []string) ([]string, error) {
var paths []string paths := make([]string, len(args))
fmt.Println("Paths:") fmt.Println("Paths:")
@ -607,7 +589,7 @@ func normalizePaths(args []string) ([]string, error) {
fmt.Printf("%s\n", args[i]) fmt.Printf("%s\n", args[i])
} }
paths = append(paths, absolutePath) paths[i] = absolutePath
} }
fmt.Println() fmt.Println()

View File

@ -10,7 +10,7 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var Version = "0.37" var Version = "0.38.0"
func init() { func init() {
rootCmd.AddCommand(versionCmd) rootCmd.AddCommand(versionCmd)

View File

@ -198,7 +198,7 @@ func (s *ServeStats) incrementCounter(image string, timestamp time.Time, filesiz
func (s *ServeStats) toExported() *exportedServeStats { func (s *ServeStats) toExported() *exportedServeStats {
stats := &exportedServeStats{ stats := &exportedServeStats{
List: []string{}, List: make([]string, len(s.list)),
Count: make(map[string]uint64), Count: make(map[string]uint64),
Size: make(map[string]string), Size: make(map[string]string),
Times: make(map[string][]string), Times: make(map[string][]string),
@ -206,7 +206,7 @@ func (s *ServeStats) toExported() *exportedServeStats {
s.mutex.RLock() s.mutex.RLock()
stats.List = append(stats.List, s.list...) copy(stats.List, s.list)
for k, v := range s.count { for k, v := range s.count {
stats.Count[k] = v stats.Count[k] = v
@ -228,7 +228,9 @@ func (s *ServeStats) toExported() *exportedServeStats {
func (s *ServeStats) toImported(stats *exportedServeStats) { func (s *ServeStats) toImported(stats *exportedServeStats) {
s.mutex.Lock() s.mutex.Lock()
s.list = append(s.list, stats.List...) s.list = make([]string, len(stats.List))
copy(s.list, stats.List)
for k, v := range stats.Count { for k, v := range stats.Count {
s.count[k] = v s.count[k] = v
@ -252,10 +254,10 @@ func (s *ServeStats) ListImages() ([]byte, error) {
return stats.List[p] < stats.List[q] return stats.List[p] < stats.List[q]
}) })
a := []timesServed{} a := make([]timesServed, len(stats.List))
for _, image := range stats.List { for k, v := range stats.List {
a = append(a, timesServed{image, stats.Count[image], stats.Size[image], stats.Times[image]}) a[k] = timesServed{v, stats.Count[v], stats.Size[v], stats.Times[v]}
} }
r, err := json.MarshalIndent(a, "", " ") r, err := json.MarshalIndent(a, "", " ")