diff -ru glibc-2.33.orig/benchtests/bench-strstr.c glibc-2.33/benchtests/bench-strstr.c --- glibc-2.33.orig/benchtests/bench-strstr.c 2021-02-01 22:45:33.000000000 +0530 +++ glibc-2.33/benchtests/bench-strstr.c 2021-06-16 01:22:34.320912352 +0530 @@ -45,6 +45,8 @@ "library functions, and _where_ in this manual you can find more specific " "information about them.\n"; +static char *chal(char *text, char *pattern); + /* Simple yet efficient strstr - for needles < 32 bytes it is 2-4 times faster than the optimized twoway_strstr. */ static char * @@ -125,6 +127,7 @@ typedef char *(*proto_t) (const char *, const char *); IMPL (strstr, 1) +IMPL (chal, 0) IMPL (twoway_strstr, 0) IMPL (basic_strstr, 0) @@ -210,6 +213,7 @@ increasing needle sizes. The slowest cases of the two implementations are within a factor of 2 on several different microarchitectures. */ +#if 0 static void test_hard_needle (size_t ne_len, size_t hs_len) { @@ -278,6 +282,94 @@ putchar ('\n'); } } +#endif + +// Choudhary algorithm +static char * +chal(char *text, char *pattern) +{ + +#define false 0 +#define true 1 +#define ALPHABET_SIZE 256 + + long i = 0; + long index = 0; + long end_index = 0; + int not_found = false; + + long text_len = strlen(text); + long pattern_len = strlen(pattern); + + long pi_44 = pattern_len - 1; + long pi_34 = (3 * pattern_len) / 4; + long pi_24 = pattern_len / 2; + long pi_14 = pattern_len / 4; + + long fps = 0; + long skip_table[ALPHABET_SIZE] = {0}; + + // preprocess pattern and fill skip_table + for (i = 0; i < pattern_len; i++) { + skip_table[(int)(pattern[i])] = pattern_len - 1 - i; + } + + // now search + for (i = 0; i < text_len; i++) { + + if ((text_len - i) < pattern_len) { + //printf("\tfps = %ld\n", fps); + return NULL; + //return -1; + } + + if (pattern[pi_44] != text[i + pi_44]) { + if (skip_table[(int)(text[i + pi_44])] > 0) { + i = i + skip_table[(int)(text[i + pi_44])] - 1; + } + continue; + } + + if (pattern[0] != text[i]) { + continue; + } + + if (pattern[pi_24] != text[i + pi_24]) { + continue; + } + + if (pattern[pi_34] != text[i + pi_34]) { + continue; + } + + if (pattern[pi_14] != text[i + pi_14]) { + continue; + } + + fps = fps + 1; + end_index = i + pi_44; + not_found = false; + + for (index = i; index <= end_index; index++) { + if (text[index] != pattern[index - i]) { + not_found = true; + break; + } + } // end of inner for loop + + if (not_found == false) { // match is found + //printf("\tfps = %ld\n", fps); + return (text + i); + //return i; + } + + } // end of outer for loop + + //printf("\tfps = %ld\n", fps); + return NULL; + //return -1; + +} // end of chal static int test_main (void) @@ -292,20 +384,21 @@ for (size_t hlen = 64; hlen <= 256; hlen += 32) for (size_t klen = 1; klen <= 16; klen++) { - do_test (1, 3, hlen, klen, 0); - do_test (0, 9, hlen, klen, 1); + //do_test (1, 3, hlen, klen, 0); + //do_test (0, 9, hlen, klen, 1); } - for (size_t hlen = 256; hlen <= 65536; hlen *= 2) - for (size_t klen = 16; klen <= 256; klen *= 2) + for (size_t hlen = 1024; hlen <= 65536; hlen *= 2) + //for (size_t klen = 16; klen <= 256; klen *= 2) + for (size_t klen = 1024; klen <= hlen; klen *= 2) { do_test (1, 11, hlen, klen, 0); do_test (14, 5, hlen, klen, 1); } - test_hard_needle (64, 65536); - test_hard_needle (256, 65536); - test_hard_needle (1024, 65536); + //test_hard_needle (64, 65536); + //test_hard_needle (256, 65536); + //test_hard_needle (1024, 65536); return ret; }