159d709d503bab6e2b61931737e662dd293b40578ccornelius/*************************************************************************** 259d709d503bab6e2b61931737e662dd293b40578ccornelius* 359d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 2013, International Business Machines 459d709d503bab6e2b61931737e662dd293b40578ccornelius* Corporation and others. All Rights Reserved. 559d709d503bab6e2b61931737e662dd293b40578ccornelius* 659d709d503bab6e2b61931737e662dd293b40578ccornelius************************************************************************/ 759d709d503bab6e2b61931737e662dd293b40578ccornelius/** 859d709d503bab6e2b61931737e662dd293b40578ccornelius * Usage: 959d709d503bab6e2b61931737e662dd293b40578ccornelius * build against a configured (but not built) ICU. 1059d709d503bab6e2b61931737e662dd293b40578ccornelius * example: cc -O2 test_LETableReference.cpp -I. -I/xsrl/II/include -I/xsrl/E/icu/source/tools/ctestfw 1159d709d503bab6e2b61931737e662dd293b40578ccornelius */ 1259d709d503bab6e2b61931737e662dd293b40578ccornelius#include "unicode/utimer.h" 1359d709d503bab6e2b61931737e662dd293b40578ccornelius#include "LETableReference.h" 1459d709d503bab6e2b61931737e662dd293b40578ccornelius#include <stdio.h> 1559d709d503bab6e2b61931737e662dd293b40578ccornelius#include <stdlib.h> 1659d709d503bab6e2b61931737e662dd293b40578ccornelius 1759d709d503bab6e2b61931737e662dd293b40578ccornelius#define ITEM_COUNT 10000 1859d709d503bab6e2b61931737e662dd293b40578ccornelius 1959d709d503bab6e2b61931737e662dd293b40578ccorneliuslong *items = 0; 2059d709d503bab6e2b61931737e662dd293b40578ccornelius 2159d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct OneObject { 2259d709d503bab6e2b61931737e662dd293b40578ccornelius long items[ITEM_COUNT]; 2359d709d503bab6e2b61931737e662dd293b40578ccornelius}; 2459d709d503bab6e2b61931737e662dd293b40578ccornelius 2559d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct Long { 2659d709d503bab6e2b61931737e662dd293b40578ccornelius long v; 2759d709d503bab6e2b61931737e662dd293b40578ccornelius}; 2859d709d503bab6e2b61931737e662dd293b40578ccornelius 2959d709d503bab6e2b61931737e662dd293b40578ccorneliusstruct CompObject { 3059d709d503bab6e2b61931737e662dd293b40578ccornelius Long items[ITEM_COUNT]; 3159d709d503bab6e2b61931737e662dd293b40578ccornelius}; 3259d709d503bab6e2b61931737e662dd293b40578ccornelius 3359d709d503bab6e2b61931737e662dd293b40578ccornelius 3459d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid time_null(void * /*ref*/) { 3559d709d503bab6e2b61931737e662dd293b40578ccornelius for(int i=0;i<ITEM_COUNT;i++) { 3659d709d503bab6e2b61931737e662dd293b40578ccornelius if(items[i]==2) { 3759d709d503bab6e2b61931737e662dd293b40578ccornelius return; 3859d709d503bab6e2b61931737e662dd293b40578ccornelius } 3959d709d503bab6e2b61931737e662dd293b40578ccornelius } 4059d709d503bab6e2b61931737e662dd293b40578ccornelius puts("error"); 4159d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 4259d709d503bab6e2b61931737e662dd293b40578ccornelius} 4359d709d503bab6e2b61931737e662dd293b40578ccornelius 4459d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid time_obj(void * ref) { 4559d709d503bab6e2b61931737e662dd293b40578ccornelius OneObject &obj = *((OneObject*)ref); 4659d709d503bab6e2b61931737e662dd293b40578ccornelius for(int i=0;i<ITEM_COUNT;i++) { 4759d709d503bab6e2b61931737e662dd293b40578ccornelius if(obj.items[i]==2) { 4859d709d503bab6e2b61931737e662dd293b40578ccornelius return; 4959d709d503bab6e2b61931737e662dd293b40578ccornelius } 5059d709d503bab6e2b61931737e662dd293b40578ccornelius } 5159d709d503bab6e2b61931737e662dd293b40578ccornelius puts("error"); 5259d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 5359d709d503bab6e2b61931737e662dd293b40578ccornelius} 5459d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid time_obj2(void * ref) { 5559d709d503bab6e2b61931737e662dd293b40578ccornelius long *items2 = ((OneObject*)ref)->items; 5659d709d503bab6e2b61931737e662dd293b40578ccornelius for(int i=0;i<ITEM_COUNT;i++) { 5759d709d503bab6e2b61931737e662dd293b40578ccornelius if(items2[i]==2) { 5859d709d503bab6e2b61931737e662dd293b40578ccornelius return; 5959d709d503bab6e2b61931737e662dd293b40578ccornelius } 6059d709d503bab6e2b61931737e662dd293b40578ccornelius } 6159d709d503bab6e2b61931737e662dd293b40578ccornelius puts("error"); 6259d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 6359d709d503bab6e2b61931737e662dd293b40578ccornelius} 6459d709d503bab6e2b61931737e662dd293b40578ccornelius 6559d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid time_letr1(void * ref) { 6659d709d503bab6e2b61931737e662dd293b40578ccornelius OneObject &obj = *((OneObject*)ref); 6759d709d503bab6e2b61931737e662dd293b40578ccornelius LETableReference data((const le_uint8*)ref, sizeof(OneObject)); 6859d709d503bab6e2b61931737e662dd293b40578ccornelius LEErrorCode success = LE_NO_ERROR; 6959d709d503bab6e2b61931737e662dd293b40578ccornelius 7059d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceTo<OneObject> stuff(data, success); 7159d709d503bab6e2b61931737e662dd293b40578ccornelius if(LE_FAILURE(success)) { 7259d709d503bab6e2b61931737e662dd293b40578ccornelius puts("failure"); 7359d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 7459d709d503bab6e2b61931737e662dd293b40578ccornelius } 7559d709d503bab6e2b61931737e662dd293b40578ccornelius long *items2 = ((OneObject*)ref)->items; 7659d709d503bab6e2b61931737e662dd293b40578ccornelius for(int i=0;i<ITEM_COUNT;i++) { 7759d709d503bab6e2b61931737e662dd293b40578ccornelius if(items[i]==2) { 7859d709d503bab6e2b61931737e662dd293b40578ccornelius return; 7959d709d503bab6e2b61931737e662dd293b40578ccornelius } 8059d709d503bab6e2b61931737e662dd293b40578ccornelius } 8159d709d503bab6e2b61931737e662dd293b40578ccornelius puts("error"); 8259d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 8359d709d503bab6e2b61931737e662dd293b40578ccornelius} 8459d709d503bab6e2b61931737e662dd293b40578ccornelius 8559d709d503bab6e2b61931737e662dd293b40578ccornelius 8659d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid time_letr2(void * ref) { 8759d709d503bab6e2b61931737e662dd293b40578ccornelius OneObject &obj = *((OneObject*)ref); 8859d709d503bab6e2b61931737e662dd293b40578ccornelius LETableReference data((const le_uint8*)ref, sizeof(OneObject)); 8959d709d503bab6e2b61931737e662dd293b40578ccornelius LEErrorCode success = LE_NO_ERROR; 9059d709d503bab6e2b61931737e662dd293b40578ccornelius 9159d709d503bab6e2b61931737e662dd293b40578ccornelius long *items2 = ((OneObject*)ref)->items; 9259d709d503bab6e2b61931737e662dd293b40578ccornelius for(int i=0;i<ITEM_COUNT;i++) { 9359d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceTo<OneObject> stuff(data, success); 9459d709d503bab6e2b61931737e662dd293b40578ccornelius if(LE_FAILURE(success)) { 9559d709d503bab6e2b61931737e662dd293b40578ccornelius puts("failure"); 9659d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 9759d709d503bab6e2b61931737e662dd293b40578ccornelius } 9859d709d503bab6e2b61931737e662dd293b40578ccornelius if(items[i]==2) { 9959d709d503bab6e2b61931737e662dd293b40578ccornelius return; 10059d709d503bab6e2b61931737e662dd293b40578ccornelius } 10159d709d503bab6e2b61931737e662dd293b40578ccornelius } 10259d709d503bab6e2b61931737e662dd293b40578ccornelius puts("error"); 10359d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 10459d709d503bab6e2b61931737e662dd293b40578ccornelius} 10559d709d503bab6e2b61931737e662dd293b40578ccornelius 10659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void time_letr3(void * ref) { 10759d709d503bab6e2b61931737e662dd293b40578ccornelius LETableReference data((const le_uint8*)ref, sizeof(OneObject)); 10859d709d503bab6e2b61931737e662dd293b40578ccornelius LEErrorCode success = LE_NO_ERROR; 10959d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceTo<CompObject> comp(data, success); 11059d709d503bab6e2b61931737e662dd293b40578ccornelius LEReferenceToArrayOf<Long> longs(comp, success, (size_t)0, ITEM_COUNT); 11159d709d503bab6e2b61931737e662dd293b40578ccornelius if(LE_FAILURE(success)) { 11259d709d503bab6e2b61931737e662dd293b40578ccornelius puts("failure"); 11359d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 11459d709d503bab6e2b61931737e662dd293b40578ccornelius } 11559d709d503bab6e2b61931737e662dd293b40578ccornelius 11659d709d503bab6e2b61931737e662dd293b40578ccornelius for(int i=0;i<ITEM_COUNT;i++) { 11759d709d503bab6e2b61931737e662dd293b40578ccornelius const Long &item = longs.getObject(i, success); 11859d709d503bab6e2b61931737e662dd293b40578ccornelius if(LE_FAILURE(success)) { 11959d709d503bab6e2b61931737e662dd293b40578ccornelius puts("failure"); 12059d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 12159d709d503bab6e2b61931737e662dd293b40578ccornelius } 12259d709d503bab6e2b61931737e662dd293b40578ccornelius if(item.v==2) { 12359d709d503bab6e2b61931737e662dd293b40578ccornelius return; 12459d709d503bab6e2b61931737e662dd293b40578ccornelius } 12559d709d503bab6e2b61931737e662dd293b40578ccornelius } 12659d709d503bab6e2b61931737e662dd293b40578ccornelius puts("error"); 12759d709d503bab6e2b61931737e662dd293b40578ccornelius abort(); 12859d709d503bab6e2b61931737e662dd293b40578ccornelius} 12959d709d503bab6e2b61931737e662dd293b40578ccornelius 13059d709d503bab6e2b61931737e662dd293b40578ccornelius 13159d709d503bab6e2b61931737e662dd293b40578ccorneliusint main() { 13259d709d503bab6e2b61931737e662dd293b40578ccornelius double runTime = 2.0; 13359d709d503bab6e2b61931737e662dd293b40578ccornelius printf("Test of LETableReference<> timing. %.1fs per run.\n", runTime); 13459d709d503bab6e2b61931737e662dd293b40578ccornelius items = new long[ITEM_COUNT]; 13559d709d503bab6e2b61931737e662dd293b40578ccornelius OneObject *oo = new OneObject(); 13659d709d503bab6e2b61931737e662dd293b40578ccornelius CompObject *oo2 = new CompObject(); 13759d709d503bab6e2b61931737e662dd293b40578ccornelius for(int i=0;i<ITEM_COUNT-1;i++) { 13859d709d503bab6e2b61931737e662dd293b40578ccornelius items[i] = oo->items[i] = oo2->items[i].v = (i%1024)+3; 13959d709d503bab6e2b61931737e662dd293b40578ccornelius } 14059d709d503bab6e2b61931737e662dd293b40578ccornelius items[ITEM_COUNT-1] = oo->items[ITEM_COUNT-1] = oo2->items[ITEM_COUNT-1].v = 2; // last one 14159d709d503bab6e2b61931737e662dd293b40578ccornelius 14259d709d503bab6e2b61931737e662dd293b40578ccornelius puts("will call once.."); 14359d709d503bab6e2b61931737e662dd293b40578ccornelius time_letr3((void*)oo2); 14459d709d503bab6e2b61931737e662dd293b40578ccornelius puts("testing all.."); 14559d709d503bab6e2b61931737e662dd293b40578ccornelius 14659d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t loopCount; 14759d709d503bab6e2b61931737e662dd293b40578ccornelius double time_taken; 14859d709d503bab6e2b61931737e662dd293b40578ccornelius 14959d709d503bab6e2b61931737e662dd293b40578ccornelius#define showTime(x,y) printf("%s:\ttesting...\r", #x); fflush(stdout); \ 15059d709d503bab6e2b61931737e662dd293b40578ccornelius time_taken = utimer_loopUntilDone(runTime, &loopCount, x, y); \ 15159d709d503bab6e2b61931737e662dd293b40578ccornelius printf("%s:\t%.1fs\t#%d\t%.1f/s\n", #x, time_taken, loopCount, loopCount/(double)time_taken); 15259d709d503bab6e2b61931737e662dd293b40578ccornelius 15359d709d503bab6e2b61931737e662dd293b40578ccornelius // clear out cache 15459d709d503bab6e2b61931737e662dd293b40578ccornelius { 15559d709d503bab6e2b61931737e662dd293b40578ccornelius double oldTime = runTime; 15659d709d503bab6e2b61931737e662dd293b40578ccornelius runTime = 0.25; 15759d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_null, NULL); 15859d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_null, NULL); 15959d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_null, NULL); 16059d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_null, NULL); 16159d709d503bab6e2b61931737e662dd293b40578ccornelius runTime = oldTime; 16259d709d503bab6e2b61931737e662dd293b40578ccornelius } 16359d709d503bab6e2b61931737e662dd293b40578ccornelius puts("-- ready to start --"); 16459d709d503bab6e2b61931737e662dd293b40578ccornelius 16559d709d503bab6e2b61931737e662dd293b40578ccornelius 16659d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_null, NULL); 16759d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_obj, (void*)oo); 16859d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_obj2, (void*)oo); 16959d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_letr1, (void*)oo2); 17059d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_letr2, (void*)oo2); 17159d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_letr3, (void*)oo2); 17259d709d503bab6e2b61931737e662dd293b40578ccornelius showTime(time_null, NULL); 17359d709d503bab6e2b61931737e662dd293b40578ccornelius 17459d709d503bab6e2b61931737e662dd293b40578ccornelius delete [] items; 17559d709d503bab6e2b61931737e662dd293b40578ccornelius delete oo; 17659d709d503bab6e2b61931737e662dd293b40578ccornelius delete oo2; 17759d709d503bab6e2b61931737e662dd293b40578ccornelius} 178