Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / icu / source / test / perf / leperf / letrperf.cpp
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 }