On Tue, 29 Sep 2009 08:11:37 -0700 (PDT) bugzilla-daemon at np.grommit.com wrote: > Note that the changes to usr/src/lib/libsum/common/sumlib.c have the same > performance benefit than using the hardcoded table in > usr/src/lib/libsum/common/sum-crc.c. > It seems the usage of |sfsprintf()|+|strmatch()| is _very_ expensive in this > codepath... ;-/
here is a patch for a simple method name prefix match --- .../sumlib.c Fri May 2 11:05:51 2008 +++ sumlib.c Tue Sep 29 11:46:55 2009 @@ -6,7 +6,7 @@ * man this is sum library */ -static const char id[] = "\n@(#)$Id: sumlib (AT&T Research) 2008-05-01 $\0\n"; +static const char id[] = "\n@(#)$Id: sumlib (AT&T Research) 2009-09-28 $\0\n"; #define _SUM_PRIVATE_ \ struct Method_s* method; \ @@ -214,6 +214,40 @@ }; /* + * simple alternation prefix match + */ + +static int +match(register const char* s, register const char* p) +{ + register const char* b = s; + + for (;;) + { + do + { + if (*p == '|' || *p == 0) + return 1; + } while (*s++ == *p++); + for (;;) + { + switch (*p++) + { + case 0: + return 0; + case '|': + break; + default: + continue; + } + break; + } + s = b; + } + return 0; +} + +/* * open sum method name */ @@ -226,20 +260,14 @@ if (!name || !name[0] || name[0] == '-' && !name[1]) name = "default"; for (n = 0; n < elementsof(maps); n++) - { - sfsprintf(pat, sizeof(pat), "*@(%s)*", maps[n].match); - if (strmatch(name, pat)) + if (match(name, maps[n].match)) { name = maps[n].map; break; } - } for (n = 0; n < elementsof(methods); n++) - { - sfsprintf(pat, sizeof(pat), "*@(%s)*", methods[n].match); - if (strmatch(name, pat)) + if (match(name, methods[n].match)) return (*methods[n].open)(&methods[n], name); - } return 0; }