FastDup/ext/klib/test/kstring_bench2.c

132 lines
3.0 KiB
C

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "kstring.h"
#ifdef __APPLE__
#define HAVE_STRNSTR
#endif
#ifdef __linux__
#define HAVE_MEMMEM
#endif
static int str_len = 1024*1024*128;
static int pat_len = 30;
static int alphabet = 2;
static int repeat = 50;
char *gen_data(int len, int a)
{
char *data;
int i;
long x;
srand48(11);
data = malloc(len);
for (i = 0; i < len; ++i)
data[i] = (int)(a * drand48()) + '!';
data[str_len - 1] = 0;
return data;
}
// http://srcvault.scali.eu.org/cgi-bin/Syntax/c/BoyerMoore.c
char *BoyerMoore( unsigned char *data, unsigned int dataLength, unsigned char *string, unsigned int strLength )
{
unsigned int skipTable[256], i;
unsigned char *search;
register unsigned char lastChar;
if (strLength == 0)
return NULL;
for (i = 0; i < 256; i++)
skipTable[i] = strLength;
search = string;
i = --strLength;
do {
skipTable[*search++] = i;
} while (i--);
lastChar = *--search;
search = data + strLength;
dataLength -= strLength+(strLength-1);
while ((int)dataLength > 0 ) {
unsigned int skip;
skip = skipTable[*search];
search += skip;
dataLength -= skip;
skip = skipTable[*search];
search += skip;
dataLength -= skip;
skip = skipTable[*search];
if (*search != lastChar) {
search += skip;
dataLength -= skip;
continue;
}
i = strLength;
do {
if (i-- == 0) return search;
} while (*--search == string[i]);
search += (strLength - i + 1);
dataLength--;
}
return NULL;
}
int main()
{
char *data;
int i;
clock_t t;
t = clock();
data = gen_data(str_len, alphabet);
fprintf(stderr, "Generate data in %.3f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
{
t = clock(); srand48(1331);
for (i = 0; i < repeat; ++i) {
int y = lrand48() % (str_len - pat_len);
char *ret;
ret = kmemmem(data, str_len, data + y, pat_len, 0);
// printf("%d, %d\n", (int)(ret - data), y);
}
fprintf(stderr, "Search patterns in %.3f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
}
if (1) {
t = clock(); srand48(1331);
for (i = 0; i < repeat; ++i) {
int y = lrand48() % (str_len - pat_len);
char *ret;
ret = BoyerMoore(data, str_len, data + y, pat_len);
// printf("%d, %d\n", (int)(ret - data), y);
}
fprintf(stderr, "Search patterns in %.3f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
}
#ifdef HAVE_STRNSTR
if (1) {
char *tmp;
t = clock(); srand48(1331);
tmp = calloc(pat_len+1, 1);
for (i = 0; i < repeat; ++i) {
int y = lrand48() % (str_len - pat_len);
char *ret;
memcpy(tmp, data + y, pat_len);
ret = strnstr(data, tmp, str_len);
}
fprintf(stderr, "Search patterns in %.3f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
}
#endif
#ifdef HAVE_MEMMEM
if (1) {
t = clock(); srand48(1331);
for (i = 0; i < repeat; ++i) {
int y = lrand48() % (str_len - pat_len);
char *ret;
ret = memmem(data, str_len, data + y, pat_len);
// printf("%d, %d\n", (int)(ret - data), y);
}
fprintf(stderr, "Search patterns in %.3f sec\n", (float)(clock() - t) / CLOCKS_PER_SEC);
}
#endif
return 0;
}