wildmatch: make a special case for "*/" with FNM_PATHNAME
Normally we need recursion for "*". In this case we know that it matches everything until "/" so we can skip the recursion. glibc, '*/*/*' on linux-2.6.git file list 2000 times before: wildmatch 8s 74513us fnmatch 1s 97042us or 13.59% faster after: wildmatch 3s 521862us fnmatch 3s 488616us or 99.06% slower Same test with compat/fnmatch: wildmatch 8s 110763us fnmatch 2s 980845us or 36.75% faster wildmatch 3s 522156us fnmatch 1s 544487us or 43.85% slower Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
1b25892636
commit
46983441ae
@ -203,6 +203,10 @@ match 1 1 'XXX/adobe/courier/bold/o/normal//12/120/75/75/m/70/iso8859/1' 'XXX/*/
|
|||||||
match 0 0 'XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*'
|
match 0 0 'XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1' 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*'
|
||||||
match 1 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt' '**/*a*b*g*n*t'
|
match 1 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt' '**/*a*b*g*n*t'
|
||||||
match 0 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz' '**/*a*b*g*n*t'
|
match 0 0 'abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz' '**/*a*b*g*n*t'
|
||||||
|
match 0 x foo '*/*/*'
|
||||||
|
match 0 x foo/bar '*/*/*'
|
||||||
|
match 1 x foo/bba/arr '*/*/*'
|
||||||
|
match 0 x foo/bb/aa/rr '*/*/*'
|
||||||
|
|
||||||
pathmatch 1 foo foo
|
pathmatch 1 foo foo
|
||||||
pathmatch 0 foo fo
|
pathmatch 0 foo fo
|
||||||
@ -218,5 +222,9 @@ pathmatch 0 foo/bba/arr 'foo/*z'
|
|||||||
pathmatch 0 foo/bba/arr 'foo/**z'
|
pathmatch 0 foo/bba/arr 'foo/**z'
|
||||||
pathmatch 1 foo/bar 'foo?bar'
|
pathmatch 1 foo/bar 'foo?bar'
|
||||||
pathmatch 1 foo/bar 'foo[/]bar'
|
pathmatch 1 foo/bar 'foo[/]bar'
|
||||||
|
pathmatch 0 foo '*/*/*'
|
||||||
|
pathmatch 0 foo/bar '*/*/*'
|
||||||
|
pathmatch 1 foo/bba/arr '*/*/*'
|
||||||
|
pathmatch 1 foo/bb/aa/rr '*/*/*'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
12
wildmatch.c
12
wildmatch.c
@ -117,6 +117,18 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
|
|||||||
return WM_NOMATCH;
|
return WM_NOMATCH;
|
||||||
}
|
}
|
||||||
return WM_MATCH;
|
return WM_MATCH;
|
||||||
|
} else if (!match_slash && *p == '/') {
|
||||||
|
/*
|
||||||
|
* _one_ asterisk followed by a slash
|
||||||
|
* with WM_PATHNAME matches the next
|
||||||
|
* directory
|
||||||
|
*/
|
||||||
|
const char *slash = strchr((char*)text, '/');
|
||||||
|
if (!slash)
|
||||||
|
return WM_NOMATCH;
|
||||||
|
text = (const uchar*)slash;
|
||||||
|
/* the slash is consumed by the top-level for loop */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
while (1) {
|
while (1) {
|
||||||
if (t_ch == '\0')
|
if (t_ch == '\0')
|
||||||
|
Loading…
Reference in New Issue
Block a user