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
22 const uint32 kNumStrings = 10000;
23
24 BString strs[kNumStrings];
25 BString ctxs[kNumStrings];
26
27 BString trls[kNumStrings];
28
29 const char *translated;
30
31 class 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
45 void
TestCreation()46 CatalogSpeed::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
82 void
TestLookup()83 CatalogSpeed::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
108 void
TestIdCreation()109 CatalogSpeed::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
148 void
TestIdLookup()149 CatalogSpeed::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
174 int
main(int argc,char ** argv)175 main(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