tizen 2.4 release
[external/xdelta3.git] / examples / compare_test.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4 #include <string.h>
5 #include <assert.h>
6
7 #include "xdelta3.h"
8
9 #define NUM (1<<20)
10 #define ITERS 100
11
12 /* From wikipedia on RDTSC */
13 inline uint64_t rdtsc() {
14   uint32_t lo, hi;
15   asm volatile ("rdtsc" : "=a" (lo), "=d" (hi));
16   return (uint64_t)hi << 32 | lo;
17 }
18
19 typedef int (*test_func)(const char *s1, const char *s2, int n);
20
21 void run_test(const char *buf1, const char *buf2,
22               const char *name, test_func func) {
23   uint64_t start, end;
24   uint64_t accum = 0;
25   int i, x;
26
27   for (i = 0; i < ITERS; i++) {
28     start = rdtsc();
29     x = func(buf1, buf2, NUM);
30     end = rdtsc();
31     accum += end - start;
32     assert(x == NUM - 1);
33   }
34
35   accum /= ITERS;
36
37   printf("%s : %qu cycles\n", name, accum);
38 }
39
40 /* Build w/ -fno-builtin for this to be fast, this assumes that there
41  * is a difference at s1[n-1] */
42 int memcmp_fake(const char *s1, const char *s2, int n) {
43   int x = memcmp(s1, s2, n);
44   return x < 0 ? n - 1 : n + 1;
45 }
46
47 #define UNALIGNED_OK 1
48 static inline int
49 test2(const char *s1c, const char *s2c, int n)
50 {
51   int i = 0;
52 #if UNALIGNED_OK
53   int nint = n / sizeof(int);
54
55   if (nint >> 3)
56     {
57       int j = 0;
58       const int *s1 = (const int*)s1c;
59       const int *s2 = (const int*)s2c;
60       int nint_8 = nint - 8;
61
62       while (i <= nint_8 &&
63              s1[i++] == s2[j++] &&
64              s1[i++] == s2[j++] &&
65              s1[i++] == s2[j++] &&
66              s1[i++] == s2[j++] &&
67              s1[i++] == s2[j++] &&
68              s1[i++] == s2[j++] &&
69              s1[i++] == s2[j++] &&       
70              s1[i++] == s2[j++]) { }
71
72       i = (i - 1) * sizeof(int);
73     }
74 #endif
75
76   while (i < n && s1c[i] == s2c[i])
77     {
78       i++;
79     }
80   return i;
81 }
82
83 static inline int
84 test1(const char *s1c, const char *s2c, int n) {
85   int i = 0;
86   while (i < n && s1c[i] == s2c[i])
87     {
88       i++;
89     }
90   return i;
91 }
92
93 int main(/*int argc, char **argv*/) {
94   char *buf1 = malloc(NUM+1);
95   char *buf2 = malloc(NUM+1);
96   int i;
97
98   for (i = 0; i < NUM; i++) {
99     buf1[i] = buf2[i] = rand();
100   }
101
102   buf2[NUM-1]++;
103
104   printf ("ALIGNED\n");
105
106   run_test(buf1, buf2, "memcmp", &memcmp_fake);
107   run_test(buf1, buf2, "test1", &test1);
108   run_test(buf1, buf2, "test2", &test2);
109
110   for (i = 0; i < NUM; i++) {
111     buf1[i] = buf2[i+1] = rand();
112   }
113
114   buf2[NUM]++;
115
116   printf ("UNALIGNED\n");
117
118   run_test(buf1, buf2+1, "memcmp", &memcmp_fake);
119   run_test(buf1, buf2+1, "test1", &test1);
120   run_test(buf1, buf2+1, "test2", &test2);
121
122   return 0;
123 }