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 } 178