efl
280 строк · 7.1 Кб
1#ifdef HAVE_CONFIG_H
2# include "config.h"
3#endif
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8#include <time.h>
9
10#ifdef EINA_BENCH_HAVE_GLIB
11# include <glib.h>
12#endif
13
14#include <Eina.h>
15#include "Evas_Data.h"
16#include "Ecore_Data.h"
17
18#include "eina_hash.h"
19#include "eina_array.h"
20#include "eina_bench.h"
21#include "eina_rbtree.h"
22#include "eina_convert.h"
23
24#ifdef CITYHASH_BENCH
25// Hash function for a byte array.
26uint64_t CityHash64(const char *buf, size_t len);
27#endif
28
29int key_size;
30char *key_str=NULL;
31
32void repchar(int n)
33{
34key_str = (char *)malloc(n);
35int i;
36
37for (i = 0; i < n; i++)
38key_str[i] = 'a';
39}
40
41static void
42eina_bench_murmur_hash(int request)
43{
44unsigned int i;
45
46for (i = 0; i < (unsigned int)request; ++i)
47{
48char tmp_key[key_size];
49
50eina_convert_itoa(i, tmp_key);
51eina_strlcat(tmp_key, key_str, key_size);
52
53eina_hash_murmur3(tmp_key, key_size);
54}
55}
56
57#ifdef CITYHASH_BENCH
58static void
59eina_bench_cityhash(int request)
60{
61unsigned int i;
62
63for (i = 0; i < (unsigned int)request; ++i)
64{
65char tmp_key[key_size];
66
67eina_convert_itoa(i, tmp_key);
68eina_strlcat(tmp_key, key_str, key_size);
69
70CityHash64(tmp_key, key_size);
71}
72}
73#endif
74
75static void
76eina_bench_superfast_hash(int request)
77{
78unsigned int i;
79
80for (i = 0; i < (unsigned int)request; ++i)
81{
82char tmp_key[key_size];
83
84eina_convert_itoa(i, tmp_key);
85eina_strlcat(tmp_key, key_str, key_size);
86
87eina_hash_superfast(tmp_key, key_size);
88}
89}
90
91static void
92eina_bench_crchash(int request)
93{
94unsigned int i;
95
96for (i = 0; i < (unsigned int)request; ++i)
97{
98char tmp_key[key_size];
99
100eina_convert_itoa(i, tmp_key);
101eina_strlcat(tmp_key, key_str, key_size);
102
103eina_hash_crc(tmp_key, key_size);
104}
105}
106
107static void
108eina_bench_djb2_hash(int request)
109{
110unsigned int i;
111
112for (i = 0; i < (unsigned int)request; ++i)
113{
114char tmp_key[key_size];
115
116eina_convert_itoa(i, tmp_key);
117eina_strlcat(tmp_key, key_str, key_size);
118
119eina_hash_djb2(tmp_key, key_size);
120}
121}
122
123#ifdef EINA_BENCH_HAVE_GLIB
124static void
125eina_bench_ghash(int request)
126{
127unsigned int i;
128
129for (i = 0; i < (unsigned int)request; ++i)
130{
131char tmp_key[key_size];
132
133eina_convert_itoa(i, tmp_key);
134eina_strlcat(tmp_key, key_str, key_size);
135
136g_str_hash(key_str);
137}
138}
139#endif
140
141int
142evas_hash_gen(const char *key)
143{
144unsigned int hash_num = 5381;
145const unsigned char *ptr;
146
147if (!key)
148return 0;
149
150for (ptr = (unsigned char *)key; *ptr; ptr++)
151hash_num = (hash_num * 33) ^ *ptr;
152
153hash_num &= 0xff;
154return (int)hash_num;
155}
156
157static void
158eina_bench_evas_hash(int request)
159{
160unsigned int i;
161
162for (i = 0; i < (unsigned int)request; ++i)
163{
164char tmp_key[key_size];
165
166eina_convert_itoa(i, tmp_key);
167eina_strlcat(tmp_key, key_str, key_size);
168
169evas_hash_gen(tmp_key);
170}
171}
172
173typedef struct _Eina_Bench_Ecore Eina_Bench_Ecore;
174struct _Eina_Bench_Ecore
175{
176char *key;
177int value;
178};
179
180void eina_bench_crc_hash_short(Eina_Benchmark *bench)
181{
182key_size = 8; /* Length of string for small strings and pointers */
183key_size -= 5;
184repchar(key_size);
185
186eina_benchmark_register(bench, "superfast-lookup",
187EINA_BENCHMARK(
188eina_bench_superfast_hash), 10, 80000, 10);
189eina_benchmark_register(bench, "djb2-lookup",
190EINA_BENCHMARK(
191eina_bench_djb2_hash), 10, 80000, 10);
192eina_benchmark_register(bench, "murmur",
193EINA_BENCHMARK(
194eina_bench_murmur_hash), 10, 80000, 10);
195eina_benchmark_register(bench, "crchash",
196EINA_BENCHMARK(
197eina_bench_crchash), 10, 80000, 10);
198#ifdef CITYHASH_BENCH
199eina_benchmark_register(bench, "cityhash",
200EINA_BENCHMARK(
201eina_bench_cityhash), 10, 80000, 10);
202#endif
203
204#ifdef EINA_BENCH_HAVE_GLIB
205eina_benchmark_register(bench, "ghash-lookup",
206EINA_BENCHMARK(
207eina_bench_ghash), 10, 80000, 10);
208#endif
209eina_benchmark_register(bench, "evas-lookup",
210EINA_BENCHMARK(
211eina_bench_evas_hash), 10, 80000, 10);
212}
213
214void eina_bench_crc_hash_medium(Eina_Benchmark *bench)
215{
216key_size = 32; /* Length of medium sized string, normally for filenames */
217key_size -= 5;
218repchar(key_size);
219
220eina_benchmark_register(bench, "superfast-lookup",
221EINA_BENCHMARK(
222eina_bench_superfast_hash), 10, 80000, 10);
223eina_benchmark_register(bench, "djb2-lookup",
224EINA_BENCHMARK(
225eina_bench_djb2_hash), 10, 80000, 10);
226eina_benchmark_register(bench, "murmur",
227EINA_BENCHMARK(
228eina_bench_murmur_hash), 10, 80000, 10);
229eina_benchmark_register(bench, "crchash",
230EINA_BENCHMARK(
231eina_bench_crchash), 10, 80000, 10);
232#ifdef CITYHASH_BENCH
233eina_benchmark_register(bench, "cityhash",
234EINA_BENCHMARK(
235eina_bench_cityhash), 10, 80000, 10);
236#endif
237
238#ifdef EINA_BENCH_HAVE_GLIB
239eina_benchmark_register(bench, "ghash-lookup",
240EINA_BENCHMARK(
241eina_bench_ghash), 10, 80000, 10);
242#endif
243eina_benchmark_register(bench, "evas-lookup",
244EINA_BENCHMARK(
245eina_bench_evas_hash), 10, 80000, 10);
246}
247
248void eina_bench_crc_hash_large(Eina_Benchmark *bench)
249{
250key_size = 256; /* Length of large strings, normally for filepath */
251key_size -= 5;
252repchar(key_size);
253
254eina_benchmark_register(bench, "superfast-lookup",
255EINA_BENCHMARK(
256eina_bench_superfast_hash), 10, 80000, 10);
257eina_benchmark_register(bench, "djb2-lookup",
258EINA_BENCHMARK(
259eina_bench_djb2_hash), 10, 80000, 10);
260eina_benchmark_register(bench, "murmur",
261EINA_BENCHMARK(
262eina_bench_murmur_hash), 10, 80000, 10);
263eina_benchmark_register(bench, "crchash",
264EINA_BENCHMARK(
265eina_bench_crchash), 10, 80000, 10);
266#ifdef CITYHASH_BENCH
267eina_benchmark_register(bench, "cityhash",
268EINA_BENCHMARK(
269eina_bench_cityhash), 10, 80000, 10);
270#endif
271
272#ifdef EINA_BENCH_HAVE_GLIB
273eina_benchmark_register(bench, "ghash-lookup",
274EINA_BENCHMARK(
275eina_bench_ghash), 10, 80000, 10);
276#endif
277eina_benchmark_register(bench, "evas-lookup",
278EINA_BENCHMARK(
279eina_bench_evas_hash), 10, 80000, 10);
280}
281