
рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рддреЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рд╢реВрдиреНрдп рдмрд┐рдЯ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдпрд╣ рдПрдХ рд╕реАрдорд╛ рд╕реЗ рдЪрд░рд┐рддреНрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рджрдХреНрд╖рддрд╛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ 0-9 рдХреА рд╕реАрдорд╛ рд╕реЗ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреА рдкрд╣рд▓реА рдШрдЯрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ)ред
рдпрд╛рдиреА рдкрд╛рда рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп
рд╡реИрдХреНрдпреВрдо рдореЗрдВ рдПрдХ рдЧреЛрд▓рд╛рдХрд╛рд░ рдШреЛрдбрд╝рд╛ рдПрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЬрдм рдПрдХ рдордирдорд╛рдирд╛ рдкрд╛рда рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдВрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдЦ gcc рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕рдВрдХрд▓рдХ рдФрд░ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рд╡рдзрд╛рдиреА, рдХрдЯ рдХреЗ рдиреАрдЪреЗ рдПрдХ рдХреЛрдбрд╛рдВрддрд░рдХ рд╣реИ!
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
1) рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
2) рдЕрдкрдиреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВред
рдпрджрд┐ рд▓рд╛рдЗрдиреЗрдВ рдЫреЛрдЯреА рд╣реИрдВ, рддреЛ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реА рдирд╣реАрдВ рдЙрдарддрд╛ред рдпрд╣ рдХрд╛рд░реНрдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд▓рд╛рдЗрдиреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рдпрд╛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪреЗрдХ рд▓рдЧрддреЗ рд╣реИрдВред
рд╣рдо рдШрдбрд╝реА () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ <time.h> рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВрдЧреЗред
рд╣рдо REGEX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡рд┐рдзрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ REGEX рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
"[[: рдЕрдВрдХ:]]"рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
clock_t tbefore; long i; double eplased; int pmatch[1]; regex_t regex; int reti; тАж. tbefore = clock(); reti = regcomp( & regex, "[[:digit:]]", 0); for (i=1;i<100000;i++){ reti = regexec(& regex, test_string, 1, pmatch, 0); } eplased=clock()-tbefore; printf("Function strchr used %.3f seconds %d\n", eplased/CLOCKS_PER_SEC, pmatch[0]); regfree( & regex);
рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐:
1.74 рд╕реЗрдХрдВрдбредрдЗрд╕ рдХреЛрдб рдореЗрдВ, рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рдВрдХрд▓рди рдФрд░ рдЦреЛрдЬ рдХреА рд╕рдлрд▓рддрд╛ рдкрд░ рдЪреЗрдХ рд╣рдЯрд╛ рджрд┐рдП рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди "рдЧреНрд░реАрдирд╣рд╛рдЙрд╕" рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЧрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣реА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдПрдХ рд░реЗрдЧреБрд▓рд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рдХреЗ рдФрд░ рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрдореЛрд░реА рдХреЛ рдлреНрд░реА рдХрд░рдХреЗ рд░рдирдЯрд╛рдЗрдо рдорд╛рдкрддрд╛ рд╣реВрдВред
рдХрд╕реНрдЯрдо рдЦреЛрдЬ рд╕рдорд╛рд░реЛрд╣
рдЖрдЗрдП рдкрд╛рд░рдВрдкрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг - рдорд╛рдереЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЦреЛрдЬ рд╕рдорд╛рд░реЛрд╣
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ (
рдПрд▓рдЧреЛрд░рд┐рджрдо 1 ):
int search1(char *str){ int l=0; int i; l = strlen(str); for (i=0;i<l;i++){ if ((str[i] >= '0') && (str[i] <= '9')){ return (i); } } return (-1); }
рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐:
7.19 рд╕реЗрдХрдВрдбредрдФрд░ рдорд╛рдк рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрдо рдирд┐рд╖реНрдкрд╛рджрди рдЧрддрд┐ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ! рдЬрд┐рд╕рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рд╣реИред
рдЕрдиреБрдХреВрд▓рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рдЪрд▓реЛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдореИрдВ рдЬреА рд╡реЙрд░реЗрди рдХреА рдХрд┐рддрд╛рдм "рдЕрд▓реНрдЧреЛрд░рд┐рдердорд┐рдХ рдЯреНрд░рд┐рдХреНрд╕ рдлреЙрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕" рдкрд░ рдЖрдпрд╛ рдерд╛ред рдФрд░ рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЕрд╢рдХреНрдд рдЪрд░рд┐рддреНрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╡рд░реНрдгрди рдерд╛ред рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реА рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рдЕрдВрдд рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ, рд╢реНрд░реЗрдгреА рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рд╡рд░реНрдг рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдг рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдордп рдореЗрдВ рдЪрд╛рд░, рд╕рд░рдгреА рд╕реЗ рджреЛрд╣рд░рд╛ рд╢рдмреНрдж рдкрдврд╝рдирд╛ (рдбреЙрд░реНрдб = 4 рдмрд╛рдЗрдЯ)ред рдпрд╛рдиреА C рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдордиреЗ рдЪрд░рд┐рддреНрд░ рд╕рд░рдгреА (char) рд╕реЗ рдмрд┐рдирд╛ рдкрдврд╝реЗ рд╣реБрдП рд▓рдВрдмреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЛ рдкрдврд╝рд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╢рдмреНрдж рдХреЗ рд╕рд╛рде рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╢реВрдиреНрдп рд╕реЗ рдиреМ рддрдХ рдХреА рд╕реАрдорд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
int zbytel3(unsigned z) { unsigned y; x = z ^ 0x30303030; // Original byte: 00 80 other y = (x & 0x7F7F7F7F) + 0x76767676; // 7F 7F 1xxxxxxx y = ~(y | x | 0x7F7F7F7F); // 80 00 00000000 // These steps map: if (y == 0) return 4; // 00000000 ==> 4, else if (y > 0x0000FFFF) // 80xxxxxx ==> 0, return (y >> 31) ^ 1; // 0080xxxx ==> 1, else // 000080xx ==> 2, return (y >> 15) ^ 3; // 00000080 ==> 3. }
рд╡рд╣ рд╣реИ, x = z ^ 0x30303030 - рдПрдХ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрд╢рди рдпрд╛ рдЬреЛ рдХрд┐ рд░реЗрдВрдЬ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ "0" - 0x30 рд╕реЗ 0. 0x76 = 0x7F-9 рд╣реИ, рдЬрд╣рд╛рдВ 9 = n-1 рд╣реИ, рдЬрд╣рд╛рдВ n рд╢реНрд░реЗрдгреА рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╕рд░рд▓ рдмрд╛рдЗрдЯ рдЕрдВрдХрдЧрдгрд┐рдд, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрдк рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ 1 рд╕реЗ 4. рддрдХ рдирдВрдмрд░ рдорд┐рд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рдкреНрд░рддреАрдХ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ 4ред
рдЕрдм рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрдЧрд╛:
int search2( char *str){ int n, j = 0; unsigned x, y, *r; const char *c_ptr; // , . for (c_ptr=str; ((unsigned long int)c_ptr & (sizeof(x) - 1)) != 0; ++c_ptr) if ((*c_ptr >= '0') && (*c_ptr <= '9')) return c_ptr - str; r = (unsigned *) c_ptr; j = c_ptr - str ; while (1){ x = *r ^ 0x30303030; y = (x & 0x7F7F7F7F) + 0x76767676; y = ~(y | x | 0x7F7F7F7F); // These steps map: if (y == 0) n = 4; // 00000000 ==> 4, else if (y > 0x0000FFFF) // 80xxxxxx ==> 0, n= (y >> 31) ^ 1; // 0080xxxx ==> 1, else // 000080xx ==> 2, n= (y >> 15) ^ 3; // 00000080 ==> 3. j=j+n ; if (n<4) {j =j +3 -2*n; break;} r++; } return (j); }
рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐:
1.71 рд╕реЗрдХрдВрдбредрдорд╛рдк рдкрд░рд┐рдгрд╛рдо regexp рдХреЗ рдХрд░реАрдм рдЧрддрд┐ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рддреЗрдЬреА рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рд╛рдБ!
рд╣рдо рдХреЛрдбрд╛рдВрддрд░рдХ рдЖрд╡реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡рд░реНрдгрд┐рдд рдкрджреНрдзрддрд┐ рдХреА рддрд╛рдХрдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдШрдбрд╝реА рдЪрдХреНрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░рд╛рдердорд┐рдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЕрдм рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрдЧрд╛:
int search3( char *str){ int n, j = 0; unsigned x, y, *r; const char *c_ptr; for (c_ptr=str; ((unsigned long int)c_ptr & (sizeof(x) - 1)) != 0; ++c_ptr) if ((*c_ptr >= '0') && (*c_ptr <= '9')) return c_ptr - str; r = (unsigned *) c_ptr; j = c_ptr - str ; while (1){ __asm__( "movl $5, %%edx\n" "movl (%%ebx), %%eax\n" "xor $0x30303030, %%eax\n" // "and $0x7F7F7F7F, %%eax\n" "add $0x76767676, %%eax\n" "movl %%eax, %%ecx\n" "or %%eax, %%ecx\n" "or $0x7F7F7F7F, %%ecx\n" "notl %%ecx\n" :"=c"(y) :"b"( r ) ); // These steps map: if (y == 0) n = 4; // 00000000 ==> 4, else if (y > 0x0000FFFF) // 80xxxxxx ==> 0, n= (y >> 31) ^ 1; // 0080xxxx ==> 1, else // 000080xx ==> 2, n= (y >> 15) ^ 3; // 00000080 ==> 3. j=j+n ; if (n<4) {j =j +3 -2*n; break;} r++; } return (j); }
рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐:
1.23 рд╕реЗрдХрдВрдбредрдореИрдВрдиреЗ рдЕрд╕реЗрдВрдмрд▓реА рдЕрд╕реЗрдВрдмрд▓реА рдХреА рдЬрдЧрд╣ рдХреЗрд╡рд▓ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХрд┐рдПред рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЛ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рднреА рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдХрдИ рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░ рджреЗрдЧрд╛ред
рд▓рд╛рдн рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рд░реЗрдЧреЗрдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдирд╣реАрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖рд╛ рдХреЗ рдЖрд╡реЗрд╖рдг рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдЖрдк рдЕрднреА рднреА рдХреЛрдб рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдФрд░ рд▓реВрдк рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЧрддрд┐ рдореЗрдВ рдбреЗрдврд╝ рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреЛрдб рдбреАрдмрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛ред рдЖрдк 32 рдХреЗ рдмрдЬрд╛рдп 64 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рднреА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрд▓ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:
regex | 1.74 |
рдПрд▓реНрдЧреЛрд░рд┐рдердо 1 | 7.19 |
рдПрд▓реНрдЧреЛрд░рд┐рдердо 2 | 1.71 |
рдПрд▓реНрдЧреЛрд░рд┐рдердо 2 + asm | 1.23 |
рдирд┐рд╖реНрдХрд░реНрд╖ рдЦреБрдж рд╣реА рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ: рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рд╕реНрд╡рд╛рдЧрдд рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдореЗрд╢рд╛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЕрдиреБрдХреВрд▓рди рд╕реЗ рд▓рд╛рдн рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ:
webfile.ru/5706721рдпреБрдкреАрдбреА:рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ -O 2 рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред
рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рднреА рдЬреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред
рдкрд░рд┐рдгрд╛рдо:
regex | 4.56 |
рдПрд▓реНрдЧреЛрд░рд┐рдердо 1 | 2.99 |
рдПрд▓реНрдЧреЛрд░рд┐рдердо 2 | 1 |
рдПрд▓реНрдЧреЛрд░рд┐рдердо 2 + asm | 1.7 * |
* -O2 рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, __volatile_ рдиреЗ рдорджрдж рдирд╣реАрдВ рдХреА, -O1 рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рдЬреЛрдбрд╝ рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдоред
UPD 2:Maratyszcza рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЙрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!) рдиреЗ
SIMD рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдФрд░ рднреА рддреЗрдЬ рд╡рд┐рдХрд▓реНрдк рдХреА
рдкреЗрд╢рдХрд╢ рдХреА ред
#include <intrin.h> const char* find_digit(const char* str) { static const __m128i str_mask[16] = { _mm_set_epi32(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x000000FF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x00FFFFFF, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x000000FF, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x00000000, 0x00FFFFFF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x00000000, 0x0000FFFF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x00000000, 0x000000FF, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF), _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x00FFFFFF), _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x0000FFFF), _mm_set_epi32(0x00000000, 0x00000000, 0x00000000, 0x000000FF) }; static const __m128i str_offset = _mm_set1_epi8(127 - '9'); static const __m128i str_threshold = _mm_set1_epi8(127 - 10); const size_t str_misalignment = ((size_t)str) & ((size_t)15); const __m128i* str_aligned = (const __m128i*)(((size_t)str) - str_misalignment); __m128i str_vector = _mm_load_si128(str_aligned); str_vector = _mm_and_si128(str_vector, str_mask[str_misalignment]); str_vector = _mm_add_epi8(str_vector, str_offset); int str_bitmask = _mm_movemask_epi8(_mm_cmpgt_epi8(str_vector, str_threshold)); unsigned long index; _BitScanForward(&index, str_bitmask); while (str_bitmask == 0) { str_aligned += 1; str_vector = _mm_load_si128(str_aligned); str_vector = _mm_add_epi8(str_vector, str_offset); str_bitmask = _mm_movemask_epi8(_mm_cmpgt_epi8(str_vector, str_threshold)); _BitScanForward(&index, str_bitmask); } return ((const char*)str_aligned) + index; }
рдпрд╣ рдЕрдм рддрдХ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬ рд╡рд┐рдХрд▓реНрдк рд╣реИред