]> git.saurik.com Git - apple/icu.git/blame - icuSources/test/perf/leperf/letrperf.cpp
ICU-57166.0.1.tar.gz
[apple/icu.git] / icuSources / test / perf / leperf / letrperf.cpp
CommitLineData
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
19long *items = 0;
20
21struct OneObject {
22 long items[ITEM_COUNT];
23};
24
25struct Long {
26 long v;
27};
28
29struct CompObject {
30 Long items[ITEM_COUNT];
31};
32
33
34void 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
44void 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}
54void 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
65void 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
86void 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
106static 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
131int 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}