Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
bench-table-factory.c
Go to the documentation of this file.
1 /* -*- c-basic-offset: 2; coding: utf-8 -*- */
2 /*
3  Copyright (C) 2008 Kouhei Sutou <kou@cozmixng.org>
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License version 2.1 as published by the Free Software Foundation.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public
15  License along with this library; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18 
19 #include <string.h>
20 
21 #include <groonga.h>
22 
23 #include "lib/benchmark.h"
24 
25 #define DEFAULT_FLAGS (GRN_OBJ_PERSISTENT | GRN_OBJ_TABLE_PAT_KEY)
26 #define DEFAULT_VALUE_SIZE (1024)
27 #define VALUE_TYPE_NAME "<value_type>"
28 
29 typedef struct _BenchmarkData
30 {
31  gchar *base_dir;
32 
34  const char *name;
35  unsigned name_size;
36  char *path;
39  unsigned value_size;
42 
43 static void
44 bench_normal(gpointer user_data)
45 {
46  BenchmarkData *data = user_data;
47  grn_obj *table;
48  grn_obj *value_type = grn_ctx_get(data->context, VALUE_TYPE_NAME, strlen(VALUE_TYPE_NAME));
49  if (!value_type) {
50  value_type = grn_type_create(data->context, VALUE_TYPE_NAME, strlen(VALUE_TYPE_NAME),
51  0, data->value_size);
52  }
53  table = grn_table_create(data->context,
54  data->name, data->name_size,
55  data->path, data->flags,
56  data->key_type, value_type);
57  grn_obj_close(data->context, table);
58 }
59 
60 static void
61 bench_normal_temporary(gpointer user_data)
62 {
63  BenchmarkData *data = user_data;
64  grn_obj *table;
65  grn_obj *value_type = grn_ctx_get(data->context, VALUE_TYPE_NAME, strlen(VALUE_TYPE_NAME));
66  if (!value_type) {
67  value_type = grn_type_create(data->context, VALUE_TYPE_NAME, strlen(VALUE_TYPE_NAME),
68  0, data->value_size);
69  }
71  table = grn_table_create(data->context,
72  data->name, data->name_size,
73  NULL, data->flags & ~GRN_OBJ_PERSISTENT,
74  data->key_type, value_type);
75  grn_obj_close(data->context, table);
76 }
77 
78 typedef struct _grn_table_factory
79 {
81  char *name;
82  unsigned name_size;
83  char *path;
86  unsigned value_size;
89 
90 static grn_table_factory *
91 grn_table_factory_create(void)
92 {
93  grn_table_factory *factory;
94 
95  factory = g_new0(grn_table_factory, 1);
96 
97  factory->context = NULL;
98  factory->name = NULL;
99  factory->name_size = 0;
100  factory->path = NULL;
101  factory->flags = DEFAULT_FLAGS;
102  factory->key_type = NULL;
103  factory->value_size = DEFAULT_VALUE_SIZE;
104  factory->encoding = GRN_ENC_DEFAULT;
105 
106  return factory;
107 }
108 
109 static void
110 grn_table_factory_set_context(grn_table_factory *factory, grn_ctx *context)
111 {
112  factory->context = context;
113 }
114 
115 static void
116 grn_table_factory_set_name(grn_table_factory *factory, const char *name)
117 {
118  factory->name = g_strdup(name);
119  factory->name_size = strlen(name);
120 }
121 
122 static void
123 grn_table_factory_set_path(grn_table_factory *factory, const char *path)
124 {
125  factory->path = g_strdup(path);
126  if (path)
127  factory->flags |= GRN_OBJ_PERSISTENT;
128  else
129  factory->flags &= ~GRN_OBJ_PERSISTENT;
130 }
131 
132 static void
133 grn_table_factory_set_key_type(grn_table_factory *factory, grn_obj *key_type)
134 {
135  factory->key_type = key_type;
136 }
137 
138 static grn_obj *
139 grn_table_factory_make(grn_table_factory *factory)
140 {
141  grn_obj *value_type = grn_ctx_get(factory->context, VALUE_TYPE_NAME, strlen(VALUE_TYPE_NAME));
142  if (!value_type) {
143  value_type = grn_type_create(factory->context, VALUE_TYPE_NAME, strlen(VALUE_TYPE_NAME),
144  0, factory->value_size);
145  }
146  GRN_CTX_SET_ENCODING(factory->context, factory->encoding);
147  return grn_table_create(factory->context,
148  factory->name, factory->name_size,
149  factory->path, factory->flags,
150  factory->key_type, value_type);
151 }
152 
153 static void
154 grn_table_factory_close(grn_table_factory *factory)
155 {
156  g_free(factory->name);
157  g_free(factory->path);
158  g_free(factory);
159 }
160 
161 static void
162 bench_factory(gpointer user_data)
163 {
164  BenchmarkData *data = user_data;
165  grn_table_factory *factory;
166  grn_obj *table;
167 
168  factory = grn_table_factory_create();
169  grn_table_factory_set_context(factory, data->context);
170  grn_table_factory_set_name(factory, data->name);
171  grn_table_factory_set_path(factory, data->path);
172  grn_table_factory_set_key_type(factory, data->key_type);
173 
174  table = grn_table_factory_make(factory);
175  grn_obj_close(data->context, table);
176 
177  grn_table_factory_close(factory);
178 }
179 
180 static void
181 bench_factory_temporary(gpointer user_data)
182 {
183  BenchmarkData *data = user_data;
184  grn_table_factory *factory;
185  grn_obj *table;
186 
187  factory = grn_table_factory_create();
188  grn_table_factory_set_context(factory, data->context);
189  grn_table_factory_set_name(factory, data->name);
190  grn_table_factory_set_key_type(factory, data->key_type);
191 
192  table = grn_table_factory_make(factory);
193  grn_obj_close(data->context, table);
194 
195  grn_table_factory_close(factory);
196 }
197 
198 static void
199 bench_setup(gpointer user_data)
200 {
201  BenchmarkData *data = user_data;
202  const gchar *type_name;
203 
205  g_mkdir_with_parents(data->base_dir, 0755);
206 
208 
209  type_name = "name";
210  data->key_type = grn_type_create(data->context,
211  type_name, strlen(type_name),
212  GRN_OBJ_KEY_UINT, sizeof(grn_id));
213 
214 }
215 
216 static void
217 bench_teardown(gpointer user_data)
218 {
219  BenchmarkData *data = user_data;
220 
221  grn_obj_close(data->context, data->key_type);
222  grn_ctx_fin(data->context);
224 }
225 
226 int
227 main(int argc, gchar **argv)
228 {
229  BenchmarkData data;
230  BenchReporter *reporter;
231  gint n = 100;
232 
233  grn_init();
234  bench_init(&argc, &argv);
235 
236  data.context = g_new(grn_ctx, 1);
237  data.base_dir = g_build_filename(g_get_tmp_dir(), "groonga-bench", NULL);
238  data.name = "table";
239  data.name_size = strlen(data.name);
240  data.path = g_build_filename(data.base_dir, "table", NULL);
241  data.flags = DEFAULT_FLAGS;
242  data.key_type = NULL;
244  data.encoding = GRN_ENC_DEFAULT;
245 
246  reporter = bench_reporter_new();
247  bench_reporter_register(reporter, "normal (persistent)", n,
248  bench_setup, bench_normal, bench_teardown, &data);
249  bench_reporter_register(reporter, "factory (persistent)", n,
250  bench_setup, bench_factory, bench_teardown, &data);
251  bench_reporter_register(reporter, "normal (temporary)", n,
252  bench_setup, bench_normal_temporary, bench_teardown,
253  &data);
254  bench_reporter_register(reporter, "factory (temporary)", n,
255  bench_setup, bench_factory_temporary, bench_teardown,
256  &data);
257  bench_reporter_run(reporter);
258  g_object_unref(reporter);
259 
261 
262  g_free(data.path);
263  g_free(data.base_dir);
264  g_free(data.context);
265 
266  bench_quit();
267  grn_fin();
268 
269  return 0;
270 }