]>
Commit | Line | Data |
---|---|---|
1 | /************************************************************************** | |
2 | * | |
3 | * © 2016 and later: Unicode, Inc. and others. | |
4 | * License & terms of use: http://www.unicode.org/copyright.html#License | |
5 | * | |
6 | *************************************************************************** | |
7 | *************************************************************************** | |
8 | * | |
9 | * Copyright (C) 2013, International Business Machines | |
10 | * Corporation and others. All Rights Reserved. | |
11 | * | |
12 | ************************************************************************/ | |
13 | /** | |
14 | * Usage: | |
15 | * build against a configured (but not built) ICU. | |
16 | * example: cc -O2 test_LETableReference.cpp -I. -I/xsrl/II/include -I/xsrl/E/icu/source/tools/ctestfw | |
17 | */ | |
18 | #include "unicode/utimer.h" | |
19 | #include "LETableReference.h" | |
20 | #include <stdio.h> | |
21 | #include <stdlib.h> | |
22 | ||
23 | #define ITEM_COUNT 10000 | |
24 | ||
25 | long *items = 0; | |
26 | ||
27 | struct OneObject { | |
28 | long items[ITEM_COUNT]; | |
29 | }; | |
30 | ||
31 | struct Long { | |
32 | long v; | |
33 | }; | |
34 | ||
35 | struct CompObject { | |
36 | Long items[ITEM_COUNT]; | |
37 | }; | |
38 | ||
39 | ||
40 | void time_null(void * /*ref*/) { | |
41 | for(int i=0;i<ITEM_COUNT;i++) { | |
42 | if(items[i]==2) { | |
43 | return; | |
44 | } | |
45 | } | |
46 | puts("error"); | |
47 | abort(); | |
48 | } | |
49 | ||
50 | void time_obj(void * ref) { | |
51 | OneObject &obj = *((OneObject*)ref); | |
52 | for(int i=0;i<ITEM_COUNT;i++) { | |
53 | if(obj.items[i]==2) { | |
54 | return; | |
55 | } | |
56 | } | |
57 | puts("error"); | |
58 | abort(); | |
59 | } | |
60 | void time_obj2(void * ref) { | |
61 | long *items2 = ((OneObject*)ref)->items; | |
62 | for(int i=0;i<ITEM_COUNT;i++) { | |
63 | if(items2[i]==2) { | |
64 | return; | |
65 | } | |
66 | } | |
67 | puts("error"); | |
68 | abort(); | |
69 | } | |
70 | ||
71 | void time_letr1(void * ref) { | |
72 | OneObject &obj = *((OneObject*)ref); | |
73 | LETableReference data((const le_uint8*)ref, sizeof(OneObject)); | |
74 | LEErrorCode success = LE_NO_ERROR; | |
75 | ||
76 | LEReferenceTo<OneObject> stuff(data, success); | |
77 | if(LE_FAILURE(success)) { | |
78 | puts("failure"); | |
79 | abort(); | |
80 | } | |
81 | long *items2 = ((OneObject*)ref)->items; | |
82 | for(int i=0;i<ITEM_COUNT;i++) { | |
83 | if(items[i]==2) { | |
84 | return; | |
85 | } | |
86 | } | |
87 | puts("error"); | |
88 | abort(); | |
89 | } | |
90 | ||
91 | ||
92 | void time_letr2(void * ref) { | |
93 | OneObject &obj = *((OneObject*)ref); | |
94 | LETableReference data((const le_uint8*)ref, sizeof(OneObject)); | |
95 | LEErrorCode success = LE_NO_ERROR; | |
96 | ||
97 | long *items2 = ((OneObject*)ref)->items; | |
98 | for(int i=0;i<ITEM_COUNT;i++) { | |
99 | LEReferenceTo<OneObject> stuff(data, success); | |
100 | if(LE_FAILURE(success)) { | |
101 | puts("failure"); | |
102 | abort(); | |
103 | } | |
104 | if(items[i]==2) { | |
105 | return; | |
106 | } | |
107 | } | |
108 | puts("error"); | |
109 | abort(); | |
110 | } | |
111 | ||
112 | static void time_letr3(void * ref) { | |
113 | LETableReference data((const le_uint8*)ref, sizeof(OneObject)); | |
114 | LEErrorCode success = LE_NO_ERROR; | |
115 | LEReferenceTo<CompObject> comp(data, success); | |
116 | LEReferenceToArrayOf<Long> longs(comp, success, (size_t)0, ITEM_COUNT); | |
117 | if(LE_FAILURE(success)) { | |
118 | puts("failure"); | |
119 | abort(); | |
120 | } | |
121 | ||
122 | for(int i=0;i<ITEM_COUNT;i++) { | |
123 | const Long &item = longs.getObject(i, success); | |
124 | if(LE_FAILURE(success)) { | |
125 | puts("failure"); | |
126 | abort(); | |
127 | } | |
128 | if(item.v==2) { | |
129 | return; | |
130 | } | |
131 | } | |
132 | puts("error"); | |
133 | abort(); | |
134 | } | |
135 | ||
136 | ||
137 | int main() { | |
138 | double runTime = 2.0; | |
139 | printf("Test of LETableReference<> timing. %.1fs per run.\n", runTime); | |
140 | items = new long[ITEM_COUNT]; | |
141 | OneObject *oo = new OneObject(); | |
142 | CompObject *oo2 = new CompObject(); | |
143 | for(int i=0;i<ITEM_COUNT-1;i++) { | |
144 | items[i] = oo->items[i] = oo2->items[i].v = (i%1024)+3; | |
145 | } | |
146 | items[ITEM_COUNT-1] = oo->items[ITEM_COUNT-1] = oo2->items[ITEM_COUNT-1].v = 2; // last one | |
147 | ||
148 | puts("will call once.."); | |
149 | time_letr3((void*)oo2); | |
150 | puts("testing all.."); | |
151 | ||
152 | int32_t loopCount; | |
153 | double time_taken; | |
154 | ||
155 | #define showTime(x,y) printf("%s:\ttesting...\r", #x); fflush(stdout); \ | |
156 | time_taken = utimer_loopUntilDone(runTime, &loopCount, x, y); \ | |
157 | printf("%s:\t%.1fs\t#%d\t%.1f/s\n", #x, time_taken, loopCount, loopCount/(double)time_taken); | |
158 | ||
159 | // clear out cache | |
160 | { | |
161 | double oldTime = runTime; | |
162 | runTime = 0.25; | |
163 | showTime(time_null, NULL); | |
164 | showTime(time_null, NULL); | |
165 | showTime(time_null, NULL); | |
166 | showTime(time_null, NULL); | |
167 | runTime = oldTime; | |
168 | } | |
169 | puts("-- ready to start --"); | |
170 | ||
171 | ||
172 | showTime(time_null, NULL); | |
173 | showTime(time_obj, (void*)oo); | |
174 | showTime(time_obj2, (void*)oo); | |
175 | showTime(time_letr1, (void*)oo2); | |
176 | showTime(time_letr2, (void*)oo2); | |
177 | showTime(time_letr3, (void*)oo2); | |
178 | showTime(time_null, NULL); | |
179 | ||
180 | delete [] items; | |
181 | delete oo; | |
182 | delete oo2; | |
183 | } |