use buffers for pathJoin, to re-use buffers. (#17960)

```
benchmark                        old ns/op     new ns/op     delta
BenchmarkPathJoin/PathJoin-8     79.6          55.3          -30.53%

benchmark                        old allocs     new allocs     delta
BenchmarkPathJoin/PathJoin-8     2              1              -50.00%

benchmark                        old bytes     new bytes     delta
BenchmarkPathJoin/PathJoin-8     48            24            -50.00%
```
This commit is contained in:
Harshavardhana
2023-08-31 17:58:48 -07:00
committed by GitHub
parent ea93643e6a
commit b1c1f02132
4 changed files with 63 additions and 21 deletions

View File

@@ -24,6 +24,7 @@ import (
"io"
"net/http"
"net/http/httptest"
"path"
"reflect"
"runtime"
"strconv"
@@ -36,6 +37,38 @@ import (
"github.com/minio/pkg/trie"
)
func pathJoinOld(elem ...string) string {
trailingSlash := ""
if len(elem) > 0 {
if hasSuffixByte(elem[len(elem)-1], SlashSeparatorChar) {
trailingSlash = SlashSeparator
}
}
return path.Join(elem...) + trailingSlash
}
func BenchmarkPathJoinOld(b *testing.B) {
b.Run("PathJoin", func(b *testing.B) {
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
pathJoinOld("volume", "path/path/path")
}
})
}
func BenchmarkPathJoin(b *testing.B) {
b.Run("PathJoin", func(b *testing.B) {
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
pathJoin("volume", "path/path/path")
}
})
}
// Wrapper
func TestPathTraversalExploit(t *testing.T) {
if runtime.GOOS != globalWindowsOSName {