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