1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/******************************************************************** 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT: 354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Copyright (c) 2002-2012, International Business Machines Corporation and 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/ 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// Defines _XOPEN_SOURCE for access to POSIX functions. 8103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius// Must be before any other #includes. 9103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "uposixdefs.h" 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uperf.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uoptions.h" 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h" 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h> 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h> 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_CONVERSION 18103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 19103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusUPerfFunction::~UPerfFunction() {} 20103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char delim = '/'; 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t execCount = 0; 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUPerfTest* UPerfTest::gTest = NULL; 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int MAXLINES = 40000; 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char UPerfTest::gUsageString[] = 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "Usage: %s [OPTIONS] [FILES]\n" 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\tReads the input file and prints out time taken in seconds\n" 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "Options:\n" 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-h or -? or --help this usage text\n" 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-v or --verbose print extra information when processing files\n" 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-s or --sourcedir source directory for files followed by path\n" 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t followed by path\n" 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-e or --encoding encoding of source files\n" 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-u or --uselen perform timing analysis on non-null terminated buffer using length\n" 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-f or --file-name file to be used as input data\n" 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-p or --passes Number of passes to be performed. Requires Numeric argument.\n" 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t Cannot be used with --time\n" 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-i or --iterations Number of iterations to be performed. Requires Numeric argument\n" 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-t or --time Threshold time for looping until in seconds. Requires Numeric argument.\n" 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t Cannot be used with --iterations\n" 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-l or --line-mode The data file should be processed in line mode\n" 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-b or --bulk-mode The data file should be processed in file based.\n" 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t Cannot be used with --line-mode\n" 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "\t-L or --locale Locale for the test\n"; 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruenum 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru HELP1, 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru HELP2, 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru VERBOSE, 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru SOURCEDIR, 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ENCODING, 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru USELEN, 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru FILE_NAME, 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru PASSES, 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ITERATIONS, 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru TIME, 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LINE_MODE, 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru BULK_MODE, 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LOCALE, 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru OPTIONS_COUNT 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UOption options[OPTIONS_COUNT+20]={ 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_HELP_H, 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_HELP_QUESTION_MARK, 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_VERBOSE, 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_SOURCEDIR, 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_ENCODING, 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_DEF( "uselen", 'u', UOPT_NO_ARG), 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_DEF( "file-name", 'f', UOPT_REQUIRES_ARG), 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_DEF( "passes", 'p', UOPT_REQUIRES_ARG), 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_DEF( "iterations", 'i', UOPT_REQUIRES_ARG), 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_DEF( "time", 't', UOPT_REQUIRES_ARG), 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_DEF( "line-mode", 'l', UOPT_NO_ARG), 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_DEF( "bulk-mode", 'b', UOPT_NO_ARG), 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_DEF( "locale", 'L', UOPT_REQUIRES_ARG) 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUPerfTest::UPerfTest(int32_t argc, const char* argv[], UErrorCode& status) 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : _argc(argc), _argv(argv), _addUsage(NULL), 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucharBuf(NULL), encoding(""), 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uselen(FALSE), 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fileName(NULL), sourceDir("."), 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru lines(NULL), numLines(0), line_mode(TRUE), 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buffer(NULL), bufferLen(0), 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru verbose(FALSE), bulk_mode(FALSE), 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru passes(1), iterations(0), time(0), 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru locale(NULL) { 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru init(NULL, 0, status); 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUPerfTest::UPerfTest(int32_t argc, const char* argv[], 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOption addOptions[], int32_t addOptionsCount, 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *addUsage, 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode& status) 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : _argc(argc), _argv(argv), _addUsage(addUsage), 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucharBuf(NULL), encoding(""), 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uselen(FALSE), 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fileName(NULL), sourceDir("."), 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru lines(NULL), numLines(0), line_mode(TRUE), 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buffer(NULL), bufferLen(0), 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru verbose(FALSE), bulk_mode(FALSE), 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru passes(1), iterations(0), time(0), 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru locale(NULL) { 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru init(addOptions, addOptionsCount, status); 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid UPerfTest::init(UOption addOptions[], int32_t addOptionsCount, 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode& status) { 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //initialize the argument list 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru U_MAIN_INIT_ARGS(_argc, _argv); 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho resolvedFileName = NULL; 11685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // add specific options 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t optionsCount = OPTIONS_COUNT; 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (addOptionsCount > 0) { 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru memcpy(options+optionsCount, addOptions, addOptionsCount*sizeof(UOption)); 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru optionsCount += addOptionsCount; 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //parse the arguments 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru _remainingArgc = u_parseArgs(_argc, (char**)_argv, optionsCount, options); 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // copy back values for additional options 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (addOptionsCount > 0) { 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru memcpy(addOptions, options+OPTIONS_COUNT, addOptionsCount*sizeof(UOption)); 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Now setup the arguments 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(_argc==1 || options[HELP1].doesOccur || options[HELP2].doesOccur) { 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[VERBOSE].doesOccur) { 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru verbose = TRUE; 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[SOURCEDIR].doesOccur) { 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru sourceDir = options[SOURCEDIR].value; 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[ENCODING].doesOccur) { 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru encoding = options[ENCODING].value; 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[USELEN].doesOccur) { 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uselen = TRUE; 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[FILE_NAME].doesOccur){ 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fileName = options[FILE_NAME].value; 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[PASSES].doesOccur) { 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru passes = atoi(options[PASSES].value); 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[ITERATIONS].doesOccur) { 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iterations = atoi(options[ITERATIONS].value); 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[TIME].doesOccur) { 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status = U_ILLEGAL_ARGUMENT_ERROR; 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else if(options[TIME].doesOccur) { 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru time = atoi(options[TIME].value); 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru iterations = 1000; // some default 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[LINE_MODE].doesOccur) { 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru line_mode = TRUE; 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru bulk_mode = FALSE; 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[BULK_MODE].doesOccur) { 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru bulk_mode = TRUE; 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru line_mode = FALSE; 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[LOCALE].doesOccur) { 18485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho locale = options[LOCALE].value; 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len = 0; 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(fileName!=NULL){ 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //pre-flight 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucbuf_resolveFileName(sourceDir, fileName, NULL, &len, &status); 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru resolvedFileName = (char*) uprv_malloc(len); 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(resolvedFileName==NULL){ 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status= U_MEMORY_ALLOCATION_ERROR; 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(status == U_BUFFER_OVERFLOW_ERROR){ 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status = U_ZERO_ERROR; 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucbuf_resolveFileName(sourceDir, fileName, resolvedFileName, &len, &status); 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucharBuf = ucbuf_open(resolvedFileName,&encoding,TRUE,FALSE,&status); 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("Could not open the input file %s. Error: %s\n", fileName, u_errorName(status)); 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruULine* UPerfTest::getLines(UErrorCode& status){ 210b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (U_FAILURE(status)) { 211b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return NULL; 212b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 213b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (lines != NULL) { 214b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return lines; // don't do it again 215b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru lines = new ULine[MAXLINES]; 217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int maxLines = MAXLINES; 218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru numLines=0; 219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar* line=NULL; 220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len =0; 221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (;;) { 222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru line = ucbuf_readline(ucharBuf,&len,&status); 223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(line == NULL || U_FAILURE(status)){ 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru lines[numLines].name = new UChar[len]; 227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru lines[numLines].len = len; 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru memcpy(lines[numLines].name, line, len * U_SIZEOF_UCHAR); 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru numLines++; 231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru len = 0; 232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (numLines >= maxLines) { 233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru maxLines += MAXLINES; 234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ULine *newLines = new ULine[maxLines]; 235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(newLines == NULL) { 236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "Out of memory reading line %d.\n", (int)numLines); 237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status= U_MEMORY_ALLOCATION_ERROR; 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete []lines; 239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return NULL; 240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru memcpy(newLines, lines, numLines*sizeof(ULine)); 243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete []lines; 244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru lines = newLines; 245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return lines; 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst UChar* UPerfTest::getBuffer(int32_t& len, UErrorCode& status){ 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status)) { 251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return NULL; 252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru len = ucbuf_size(ucharBuf); 254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buffer = (UChar*) uprv_malloc(U_SIZEOF_UCHAR * (len+1)); 255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_strncpy(buffer,ucbuf_getBuffer(ucharBuf,&bufferLen,&status),len); 256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru buffer[len]=0; 257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru len = bufferLen; 258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return buffer; 259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool UPerfTest::run(){ 261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(_remainingArgc==1){ 262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Testing all methods 263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return runTest(); 264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool res=FALSE; 266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Test only the specified fucntion 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (int i = 1; i < _remainingArgc; ++i) { 268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (_argv[i][0] != '-') { 269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char* name = (char*) _argv[i]; 270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(verbose==TRUE){ 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //fprintf(stdout, "\n=== Handling test: %s: ===\n", name); 272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //fprintf(stdout, "\n%s:\n", name); 273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char* parameter = strchr( name, '@' ); 275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (parameter) { 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *parameter = 0; 277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru parameter += 1; 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru execCount = 0; 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru res = runTest( name, parameter ); 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (!res || (execCount <= 0)) { 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "\n---ERROR: Test doesn't exist: %s!\n", name); 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return FALSE; 284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return res; 288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool UPerfTest::runTest(char* name, char* par ){ 290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool rval; 291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char* pos = NULL; 292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (name) 294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru pos = strchr( name, delim ); // check if name contains path (by looking for '/') 295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (pos) { 296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru path = pos+1; // store subpath for calling subtest 297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *pos = 0; // split into two strings 298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru path = NULL; 300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (!name || (name[0] == 0) || (strcmp(name, "*") == 0)) { 303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rval = runTestLoop( NULL, NULL ); 304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else if (strcmp( name, "LIST" ) == 0) { 306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru this->usage(); 307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rval = TRUE; 308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rval = runTestLoop( name, par ); 311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (pos) 314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *pos = delim; // restore original value at pos 315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return rval; 316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid UPerfTest::setPath( char* pathVal ) 320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru this->path = pathVal; 322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// call individual tests, to be overriden to call implementations 32554dcd9b6a06071f647dac967e9e267abb9410720Craig CorneliusUPerfFunction* UPerfTest::runIndexedTest( int32_t /*index*/, UBool /*exec*/, const char* & /*name*/, char* /*par*/ ) 326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // to be overriden by a method like: 328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru switch (index) { 330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 0: name = "First Test"; if (exec) FirstTest( par ); break; 331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 1: name = "Second Test"; if (exec) SecondTest( par ); break; 332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru default: name = ""; break; 333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr,"*** runIndexedTest needs to be overriden! ***"); 336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return NULL; 337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool UPerfTest::runTestLoop( char* testname, char* par ) 341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t index = 0; 343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char* name; 344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool run_this_test; 345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool rval = FALSE; 346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UPerfTest* saveTest = gTest; 348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gTest = this; 349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t loops = 0; 350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double t=0; 351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t n = 1; 352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru long ops; 353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru do { 354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru this->runIndexedTest( index, FALSE, name ); 355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (!name || (name[0] == 0)) 356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (!testname) { 358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru run_this_test = TRUE; 359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru run_this_test = (UBool) (strcmp( name, testname ) == 0); 361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (run_this_test) { 363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UPerfFunction* testFunction = this->runIndexedTest( index, TRUE, name, par ); 364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru execCount++; 365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru rval=TRUE; 366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(testFunction==NULL){ 367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr,"%s function returned NULL", name); 368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return FALSE; 369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ops = testFunction->getOperationsPerIteration(); 371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (ops < 1) { 372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s returned an illegal operations/iteration()\n", name); 373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return FALSE; 374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(iterations == 0) { 376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru n = time; 377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Run for specified duration in seconds 378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(verbose==TRUE){ 379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout,"= %s calibrating %i seconds \n", name, (int)n); 380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //n *= 1000; // s => ms 383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //System.out.println("# " + meth.getName() + " " + n + " sec"); 384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t failsafe = 1; // last resort for very fast methods 385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru t = 0; 386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while (t < (int)(n * 0.9)) { // 90% is close enough 387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (loops == 0 || t == 0) { 388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru loops = failsafe; 389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru failsafe *= 10; 390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //System.out.println("# " + meth.getName() + " x " + loops + " = " + t); 392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru loops = (int)((double)n / t * loops + 0.5); 393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (loops == 0) { 394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr,"Unable to converge on desired duration"); 395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return FALSE; 396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //System.out.println("# " + meth.getName() + " x " + loops); 399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru t = testFunction->time(loops,&status); 400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("Performance test failed with error: %s \n", u_errorName(status)); 402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru loops = iterations; 407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double min_t=1000000.0, sum_t=0.0; 410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru long events = -1; 411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for(int32_t ps =0; ps < passes; ps++){ 413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout,"= %s begin " ,name); 414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(verbose==TRUE){ 415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(iterations > 0) { 416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "%i\n", (int)loops); 417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "%i\n", (int)n); 419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "\n"); 422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru t = testFunction->time(loops, &status); 424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_FAILURE(status)){ 425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printf("Performance test failed with error: %s \n", u_errorName(status)); 426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru sum_t+=t; 429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(t<min_t) { 430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru min_t=t; 431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru events = testFunction->getEventsPerIteration(); 433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //print info only in verbose mode 434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(verbose==TRUE){ 435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(events == -1){ 436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "= %s end: %f loops: %i operations: %li \n", name, t, (int)loops, ops); 437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "= %s end: %f loops: %i operations: %li events: %li\n", name, t, (int)loops, ops, events); 439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(events == -1){ 442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout,"= %s end %f %i %li\n", name, t, (int)loops, ops); 443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }else{ 444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout,"= %s end %f %i %li %li\n", name, t, (int)loops, ops, events); 445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(verbose && U_SUCCESS(status)) { 449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double avg_t = sum_t/passes; 450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (loops == 0 || ops == 0) { 451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, "%s did not run\n", name); 452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else if(events == -1) { 454ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "%%= %s avg: %.4g loops: %i avg/op: %.4g ns\n", 455ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru name, avg_t, (int)loops, (avg_t*1E9)/(loops*ops)); 456ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "_= %s min: %.4g loops: %i min/op: %.4g ns\n", 457ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru name, min_t, (int)loops, (min_t*1E9)/(loops*ops)); 458ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 459ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else { 460ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "%%= %s avg: %.4g loops: %i avg/op: %.4g ns avg/event: %.4g ns\n", 461ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru name, avg_t, (int)loops, (avg_t*1E9)/(loops*ops), (avg_t*1E9)/(loops*events)); 462ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout, "_= %s min: %.4g loops: %i min/op: %.4g ns min/event: %.4g ns\n", 463ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru name, min_t, (int)loops, (min_t*1E9)/(loops*ops), (min_t*1E9)/(loops*events)); 464ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 465ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 466ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete testFunction; 467ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 468ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru index++; 469ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }while(name); 470ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 471ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gTest = saveTest; 472ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return rval; 473ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 474ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 475ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 476ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Print a usage message for this test class. 477ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 478ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid UPerfTest::usage( void ) 479ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 480ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(gUsageString); 481ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (_addUsage != NULL) { 482ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru puts(_addUsage); 483ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 484ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 485ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool save_verbose = verbose; 486ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru verbose = TRUE; 487ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout,"Test names:\n"); 488ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stdout,"-----------\n"); 489ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 490ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t index = 0; 491ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char* name = NULL; 492ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru do{ 493ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru this->runIndexedTest( index, FALSE, name ); 494ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (!name) 495ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 496b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fprintf(stdout, "%s\n", name); 497ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru index++; 498ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }while (name && (name[0] != 0)); 499ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru verbose = save_verbose; 500ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 501ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 502ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 503ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 504ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 505ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid UPerfTest::setCaller( UPerfTest* callingTest ) 506ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 507ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru caller = callingTest; 508ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (caller) { 509ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru verbose = caller->verbose; 510ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 511ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 512ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 513ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool UPerfTest::callTest( UPerfTest& testToBeCalled, char* par ) 514ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 515ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru execCount--; // correct a previously assumed test-exec, as this only calls a subtest 516ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru testToBeCalled.setCaller( this ); 517ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return testToBeCalled.runTest( path, par ); 518ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 519ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 520ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUPerfTest::~UPerfTest(){ 521ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(lines!=NULL){ 522ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete[] lines; 523ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 524ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(buffer!=NULL){ 525ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_free(buffer); 526ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 527ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(resolvedFileName!=NULL){ 528ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_free(resolvedFileName); 529ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 530ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ucbuf_close(ucharBuf); 531ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 532ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 533ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 534