mirror of
https://github.com/octoleo/restic.git
synced 2024-11-10 23:31:09 +00:00
filter: Optimize double wildcard expansion
This only allocates a single slice to expand the double wildcard and only copies the pattern prefix once. name old time/op new time/op delta FilterPatterns/Relative-4 22.7ms ± 5% 23.3ms ± 9% ~ (p=0.353 n=10+10) FilterPatterns/Absolute-4 14.2ms ±13% 13.9ms ± 7% ~ (p=0.853 n=10+10) FilterPatterns/Wildcard-4 266ms ±16% 51ms ± 7% -80.67% (p=0.000 n=10+9) FilterPatterns/ManyNoMatch-4 554ms ± 6% 551ms ± 9% ~ (p=0.436 n=10+10) name old alloc/op new alloc/op delta FilterPatterns/Relative-4 3.57MB ± 0% 3.57MB ± 0% ~ (p=0.349 n=10+10) FilterPatterns/Absolute-4 3.57MB ± 0% 3.57MB ± 0% ~ (p=0.073 n=10+9) FilterPatterns/Wildcard-4 141MB ± 0% 14MB ± 0% -89.89% (p=0.000 n=10+9) FilterPatterns/ManyNoMatch-4 3.57MB ± 0% 3.57MB ± 0% ~ (all equal) name old allocs/op new allocs/op delta FilterPatterns/Relative-4 22.2k ± 0% 22.2k ± 0% ~ (all equal) FilterPatterns/Absolute-4 22.2k ± 0% 22.2k ± 0% ~ (all equal) FilterPatterns/Wildcard-4 1.63M ± 0% 0.09M ± 0% -94.56% (p=0.000 n=10+10) FilterPatterns/ManyNoMatch-4 22.2k ± 0% 22.2k ± 0% ~ (all equal)
This commit is contained in:
parent
7959796269
commit
17c53efb0d
@ -123,11 +123,15 @@ func hasDoubleWildcard(list Pattern) (ok bool, pos int) {
|
|||||||
func match(patterns Pattern, strs []string) (matched bool, err error) {
|
func match(patterns Pattern, strs []string) (matched bool, err error) {
|
||||||
if ok, pos := hasDoubleWildcard(patterns); ok {
|
if ok, pos := hasDoubleWildcard(patterns); ok {
|
||||||
// gradually expand '**' into separate wildcards
|
// gradually expand '**' into separate wildcards
|
||||||
for i := 0; i <= len(strs)-len(patterns)+1; i++ {
|
newPat := make(Pattern, len(strs))
|
||||||
newPat := make(Pattern, pos)
|
// copy static prefix once
|
||||||
copy(newPat, patterns[:pos])
|
copy(newPat, patterns[:pos])
|
||||||
for k := 0; k < i; k++ {
|
for i := 0; i <= len(strs)-len(patterns)+1; i++ {
|
||||||
newPat = append(newPat, "*")
|
// limit to static prefix and already appended '*'
|
||||||
|
newPat := newPat[:pos+i]
|
||||||
|
// in the first iteration the wildcard expands to nothing
|
||||||
|
if i > 0 {
|
||||||
|
newPat[pos+i-1] = "*"
|
||||||
}
|
}
|
||||||
newPat = append(newPat, patterns[pos+1:]...)
|
newPat = append(newPat, patterns[pos+1:]...)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user