summaryrefslogtreecommitdiff
path: root/test/benchmarks/murmur.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/benchmarks/murmur.c')
-rw-r--r--test/benchmarks/murmur.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/test/benchmarks/murmur.c b/test/benchmarks/murmur.c
new file mode 100644
index 0000000..09a9441
--- /dev/null
+++ b/test/benchmarks/murmur.c
@@ -0,0 +1,138 @@
+int open(char *, int, int);
+long read(int, unsigned char *, unsigned long);
+int printf(char *, ...);
+void *malloc(unsigned long);
+void exit(int);
+
+void PMurHash32_Process(unsigned int *ph1, unsigned int *pcarry, void *key,
+ int len) {
+ unsigned int h1 = *ph1;
+ unsigned int c = *pcarry;
+ int n = c & 3;
+ int i = (4 - n) & 3;
+
+ unsigned char *ptr = (unsigned char *)key;
+ unsigned char *end;
+
+
+ if (i && i <= len) {
+ do {
+ int _i = i;
+ while (_i--) {
+ c = c >> 8 | *ptr++ << 24;
+ n++;
+ len--;
+ if (n == 4) {
+ do {
+ c *= (0xcc9e2d51);
+ c = (((unsigned int)c << 15) | ((unsigned int)c >> (32 - 15)));
+ c *= (0x1b873593);
+ h1 ^= c;
+ h1 = (((unsigned int)h1 << 13) | ((unsigned int)h1 >> (32 - 13)));
+ h1 = h1 * 5 + 0xe6546b64;
+ } while (0);
+ n = 0;
+ }
+ }
+ } while (0);
+ }
+
+ end = ptr + len / 4 * 4;
+ for (; ptr < end; ptr += 4) {
+ unsigned int k1;
+
+ k1 = (ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24);
+ do {
+ k1 *= (0xcc9e2d51);
+ k1 = (((unsigned int)k1 << 15) | ((unsigned int)k1 >> (32 - 15)));
+ k1 *= (0x1b873593);
+ h1 ^= k1;
+ h1 = (((unsigned int)h1 << 13) | ((unsigned int)h1 >> (32 - 13)));
+ h1 = h1 * 5 + 0xe6546b64;
+ } while (0);
+ }
+ len -= len / 4 * 4;
+
+ do {
+ int _i = len;
+ while (_i--) {
+ c = c >> 8 | *ptr++ << 24;
+ n++;
+ len--;
+ if (n == 4) {
+ do {
+ c *= (0xcc9e2d51);
+ c = (((unsigned int)c << 15) | ((unsigned int)c >> (32 - 15)));
+ c *= (0x1b873593);
+ h1 ^= c;
+ h1 = (((unsigned int)h1 << 13) | ((unsigned int)h1 >> (32 - 13)));
+ h1 = h1 * 5 + 0xe6546b64;
+ } while (0);
+ n = 0;
+ }
+ }
+ } while (0);
+
+ *ph1 = h1;
+ *pcarry = (c & ~0xff) | n;
+}
+
+unsigned int PMurHash32_Result(unsigned int h, unsigned int carry,
+ unsigned int total_length) {
+ unsigned int k1;
+ int n = carry & 3;
+ if (n) {
+ k1 = carry >> (4 - n) * 8;
+ k1 *= (0xcc9e2d51);
+ k1 = (((unsigned int)k1 << 15) | ((unsigned int)k1 >> (32 - 15)));
+ k1 *= (0x1b873593);
+ h ^= k1;
+ }
+ h ^= total_length;
+
+ h ^= h >> 16;
+ h *= 0x85ebca6b;
+ h ^= h >> 13;
+ h *= 0xc2b2ae35;
+ h ^= h >> 16;
+
+ return h;
+}
+
+unsigned int PMurHash32(unsigned int seed, void *key, int len) {
+ unsigned int h1 = seed, carry = 0;
+ PMurHash32_Process(&h1, &carry, key, len);
+ return PMurHash32_Result(h1, carry, len);
+}
+
+void *read_file(int fd, int *len)
+{
+ int size = 1500 * 1024 * 1024;
+ unsigned char *arr = malloc(size);
+ int i;
+ for (i = 0; ;) {
+ int rd = read(fd, arr + i, size - i);
+ if (rd < 0)
+ exit(2);
+ if (rd == 0)
+ break;
+ i += rd;
+ }
+
+ *len = i;
+ return arr;
+}
+
+int main(int argc, char **argv) {
+ int fd, len;
+ char *buf;
+
+ fd = open(argv[1], 0, 0);
+ if (fd == -1)
+ return 1;
+ buf = read_file(fd, &len);
+ printf("len: %d\n", len);
+
+ printf("%u\n", PMurHash32(0, buf, len));
+ return 0;
+}