Vasiliy, For portability, when you initialize cfg.WorkDir, clean it: cfg.WorkDir = filepath.Clean(cfg.WorkDir)
You can reduce the allocations from 5 to 1. However, optimization can lead to obscurity. For example, $ go test oid_test.go -bench=. BenchmarkVasiliy-4 2000000 700 ns/op 88 B/op 5 allocs/op BenchmarkKrolaw-4 3000000 550 ns/op 80 B/op 4 allocs/op BenchmarkPeter-4 10000000 201 ns/op 48 B/op 1 allocs/op Playground: https://play.golang.org/p/DnGoM8PYd6 Peter On Thursday, November 9, 2017 at 3:58:03 PM UTC-5, Vasiliy Tolstov wrote: > > Hi. I have server that read/write data to many files (each is about > 4-32Mb). To determine on which file i need to read/write i'm use this > function to os.OpenFile > > func oid2filepath(cfg *Config, oID uint64) string { > file_path := filepath.Join(cfg.WorkDir, fmt.Sprintf("%x", > oid2vid(oID)), fmt.Sprintf("%016x", oID)) > return file_path > } > > oid2vid function get uint32 and return uint32 with shift some bits > path looks like (for one of 4Mb chunk) store/obj/7c2b25/007c2b2500000180 > > When i'm write 4Gb data i need to call this function 1024 times for > single big chunk of data. > Does it possible to write function that does not have additional > allocations? > And does it possible to write it in portable way (i mean path separator). > > > -- > Vasiliy Tolstov, > e-mail: v.to...@selfip.ru <javascript:> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.