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