1/*
2** Copyright 2003, Oliver Tappe, zooey@hirschkaefer.de. All rights reserved.
3** Distributed under the terms of the MIT License.
4*/
5
6#include <assert.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <typeinfo>
10#include <unistd.h>
11
12#include <Application.h>
13#include <StopWatch.h>
14
15#include <Catalog.h>
16#include <HashMapCatalog.h>
17#include <Entry.h>
18#include <Locale.h>
19#include <Path.h>
20#include <Roster.h>
21
22const uint32 kNumStrings = 10000;
23
24BString strs[kNumStrings];
25BString ctxs[kNumStrings];
26
27BString trls[kNumStrings];
28
29const char *translated;
30
31class CatalogSpeed {
32	public:
33		void TestCreation();
34		void TestLookup();
35		void TestIdCreation();
36		void TestIdLookup();
37};
38
39#define B_TRANSLATION_CONTEXT "CatalogSpeed"
40
41#define catSig "x-vnd.Be.locale.catalogSpeed"
42#define catName catSig".catalog"
43
44
45void
46CatalogSpeed::TestCreation()
47{
48	for (uint32 i = 0; i < kNumStrings; i++) {
49		strs[i] << "native-string#" << 1000000+i;
50		ctxs[i] << B_TRANSLATION_CONTEXT;
51		trls[i] << "translation#" << 4000000+i;
52	}
53
54	BStopWatch watch("catalogSpeed", true);
55
56	status_t res;
57	assert(be_locale != NULL);
58	system("mkdir -p ./locale/catalogs/"catSig);
59
60	// create an empty catalog of default type...
61	BPrivate::EditableCatalog cat1("Default", catSig, "klingon");
62	assert(cat1.InitCheck() == B_OK);
63
64	// ...and populate the catalog with some data:
65	for (uint32 i = 0; i < kNumStrings; i++) {
66		cat1.SetString(strs[i].String(), trls[i].String(), ctxs[i].String());
67	}
68	watch.Suspend();
69	printf("\tadded %ld strings in           %9Ld usecs\n",
70		cat1.CountItems(), watch.ElapsedTime());
71
72	watch.Reset();
73	watch.Resume();
74	res = cat1.WriteToFile("./locale/catalogs/"catSig"/klingon.catalog");
75	assert(res == B_OK);
76	watch.Suspend();
77	printf("\t%ld strings written to disk in %9Ld usecs\n",
78		cat1.CountItems(), watch.ElapsedTime());
79}
80
81
82void
83CatalogSpeed::TestLookup()
84{
85	BStopWatch watch("catalogSpeed", true);
86
87	BCatalog *cat = be_catalog = new BCatalog(catSig, "klingon");
88
89	assert(cat != NULL);
90	assert(cat->InitCheck() == B_OK);
91	watch.Suspend();
92	printf("\t%ld strings read from disk in  %9Ld usecs\n",
93		cat->CountItems(), watch.ElapsedTime());
94
95	watch.Reset();
96	watch.Resume();
97	for (uint32 i = 0; i < kNumStrings; i++) {
98		translated = B_TRANSLATE(strs[i].String());
99	}
100	watch.Suspend();
101	printf("\tlooked up %lu strings in       %9Ld usecs\n",
102		kNumStrings, watch.ElapsedTime());
103
104	delete cat;
105}
106
107
108void
109CatalogSpeed::TestIdCreation()
110{
111	BStopWatch watch("catalogSpeed", true);
112	watch.Suspend();
113
114	status_t res;
115	BString s("string");
116	s << "\x01" << typeid(*this).name() << "\x01";
117	//size_t hashVal = __stl_hash_string(s.String());
118	assert(be_locale != NULL);
119	system("mkdir -p ./locale/catalogs/"catSig);
120
121	// create an empty catalog of default type...
122	BPrivate::EditableCatalog cat1("Default", catSig, "klingon");
123	assert(cat1.InitCheck() == B_OK);
124
125	// ...and populate the catalog with some data:
126	for (uint32 i = 0; i < kNumStrings; i++) {
127		trls[i] = BString("id_translation#") << 6000000+i;
128	}
129	watch.Reset();
130	watch.Resume();
131	for (uint32 i = 0; i < kNumStrings; i++) {
132		cat1.SetString(i, trls[i].String());
133	}
134	watch.Suspend();
135	printf("\tadded %ld strings by id in     %9Ld usecs\n",
136		cat1.CountItems(), watch.ElapsedTime());
137
138	watch.Reset();
139	watch.Resume();
140	res = cat1.WriteToFile("./locale/catalogs/"catSig"/klingon.catalog");
141	assert( res == B_OK);
142	watch.Suspend();
143	printf("\t%ld strings written to disk in %9Ld usecs\n",
144		cat1.CountItems(), watch.ElapsedTime());
145}
146
147
148void
149CatalogSpeed::TestIdLookup()
150{
151	BStopWatch watch("catalogSpeed", true);
152
153	BCatalog *cat = be_catalog = new BCatalog(catSig, "klingon");
154
155	assert(cat != NULL);
156	assert(cat->InitCheck() == B_OK);
157	watch.Suspend();
158	printf("\t%ld strings read from disk in  %9Ld usecs\n",
159		cat->CountItems(), watch.ElapsedTime());
160
161	watch.Reset();
162	watch.Resume();
163	for (uint32 i = 0; i < kNumStrings; i++) {
164		translated = B_TRANSLATE_ID(i);
165	}
166	watch.Suspend();
167	printf("\tlooked up %lu strings in       %9Ld usecs\n",
168		kNumStrings, watch.ElapsedTime());
169
170	delete cat;
171}
172
173
174int
175main(int argc, char **argv)
176{
177	BApplication* testApp
178		= new BApplication("application/"catSig);
179
180	// change to app-folder:
181	app_info appInfo;
182	be_app->GetAppInfo(&appInfo);
183	BEntry appEntry(&appInfo.ref);
184	BEntry appFolder;
185	appEntry.GetParent(&appFolder);
186	BPath appPath;
187	appFolder.GetPath(&appPath);
188	chdir(appPath.Path());
189
190	CatalogSpeed catSpeed;
191	printf("\t------------------------------------------------\n");
192	printf("\tstring-based catalog usage:\n");
193	printf("\t------------------------------------------------\n");
194	catSpeed.TestCreation();
195	catSpeed.TestLookup();
196	printf("\t------------------------------------------------\n");
197	printf("\tid-based catalog usage:\n");
198	printf("\t------------------------------------------------\n");
199	catSpeed.TestIdCreation();
200	catSpeed.TestIdLookup();
201
202	delete testApp;
203
204	return 0;
205}
206