127f654740f2a26ad62a5c155af9199af9e69b889claireho/*
227f654740f2a26ad62a5c155af9199af9e69b889claireho**********************************************************************
383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius* Copyright (c) 2002-2011,International Business Machines
427f654740f2a26ad62a5c155af9199af9e69b889claireho* Corporation and others.  All Rights Reserved.
527f654740f2a26ad62a5c155af9199af9e69b889claireho**********************************************************************
627f654740f2a26ad62a5c155af9199af9e69b889claireho**********************************************************************
727f654740f2a26ad62a5c155af9199af9e69b889claireho*/
827f654740f2a26ad62a5c155af9199af9e69b889claireho
927f654740f2a26ad62a5c155af9199af9e69b889claireho#include "DateFmtPerf.h"
1027f654740f2a26ad62a5c155af9199af9e69b889claireho#include "uoptions.h"
1127f654740f2a26ad62a5c155af9199af9e69b889claireho#include <stdio.h>
1227f654740f2a26ad62a5c155af9199af9e69b889claireho#include <fstream>
1327f654740f2a26ad62a5c155af9199af9e69b889claireho
1427f654740f2a26ad62a5c155af9199af9e69b889claireho#include <iostream>
1527f654740f2a26ad62a5c155af9199af9e69b889clairehousing namespace std;
1627f654740f2a26ad62a5c155af9199af9e69b889claireho
1727f654740f2a26ad62a5c155af9199af9e69b889clairehoDateFormatPerfTest::DateFormatPerfTest(int32_t argc, const char* argv[], UErrorCode& status)
1827f654740f2a26ad62a5c155af9199af9e69b889claireho: UPerfTest(argc,argv,status) {
1927f654740f2a26ad62a5c155af9199af9e69b889claireho
2027f654740f2a26ad62a5c155af9199af9e69b889claireho    if (locale == NULL){
2127f654740f2a26ad62a5c155af9199af9e69b889claireho        locale = "en_US";   // set default locale
2227f654740f2a26ad62a5c155af9199af9e69b889claireho    }
2327f654740f2a26ad62a5c155af9199af9e69b889claireho}
2427f654740f2a26ad62a5c155af9199af9e69b889claireho
2527f654740f2a26ad62a5c155af9199af9e69b889clairehoDateFormatPerfTest::~DateFormatPerfTest()
2627f654740f2a26ad62a5c155af9199af9e69b889claireho{
2727f654740f2a26ad62a5c155af9199af9e69b889claireho}
2827f654740f2a26ad62a5c155af9199af9e69b889claireho
2927f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::runIndexedTest(int32_t index, UBool exec,const char* &name, char* par) {
3027f654740f2a26ad62a5c155af9199af9e69b889claireho
3127f654740f2a26ad62a5c155af9199af9e69b889claireho	//exec = true;
3227f654740f2a26ad62a5c155af9199af9e69b889claireho
3327f654740f2a26ad62a5c155af9199af9e69b889claireho    switch (index) {
3427f654740f2a26ad62a5c155af9199af9e69b889claireho        TESTCASE(0,DateFmt250);
3527f654740f2a26ad62a5c155af9199af9e69b889claireho        TESTCASE(1,DateFmt10000);
3683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        TESTCASE(2,DateFmt100000);
3727f654740f2a26ad62a5c155af9199af9e69b889claireho        TESTCASE(3,BreakItWord250);
3883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        TESTCASE(4,BreakItWord10000);
3983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        TESTCASE(5,BreakItChar250);
4083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        TESTCASE(6,BreakItChar10000);
4127f654740f2a26ad62a5c155af9199af9e69b889claireho        TESTCASE(7,NumFmt10000);
4227f654740f2a26ad62a5c155af9199af9e69b889claireho        TESTCASE(8,NumFmt100000);
4327f654740f2a26ad62a5c155af9199af9e69b889claireho        TESTCASE(9,Collation10000);
4427f654740f2a26ad62a5c155af9199af9e69b889claireho        TESTCASE(10,Collation100000);
4527f654740f2a26ad62a5c155af9199af9e69b889claireho
4627f654740f2a26ad62a5c155af9199af9e69b889claireho        default:
4727f654740f2a26ad62a5c155af9199af9e69b889claireho            name = "";
4827f654740f2a26ad62a5c155af9199af9e69b889claireho            return NULL;
4927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
5027f654740f2a26ad62a5c155af9199af9e69b889claireho    return NULL;
5127f654740f2a26ad62a5c155af9199af9e69b889claireho}
5227f654740f2a26ad62a5c155af9199af9e69b889claireho
5327f654740f2a26ad62a5c155af9199af9e69b889claireho
5427f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::DateFmt250(){
5527f654740f2a26ad62a5c155af9199af9e69b889claireho    DateFmtFunction* func= new DateFmtFunction(1, locale);
5627f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
5727f654740f2a26ad62a5c155af9199af9e69b889claireho}
5827f654740f2a26ad62a5c155af9199af9e69b889claireho
5927f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::DateFmt10000(){
6027f654740f2a26ad62a5c155af9199af9e69b889claireho    DateFmtFunction* func= new DateFmtFunction(40, locale);
6127f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
6227f654740f2a26ad62a5c155af9199af9e69b889claireho}
6327f654740f2a26ad62a5c155af9199af9e69b889claireho
6427f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::DateFmt100000(){
6527f654740f2a26ad62a5c155af9199af9e69b889claireho    DateFmtFunction* func= new DateFmtFunction(400, locale);
6627f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
6727f654740f2a26ad62a5c155af9199af9e69b889claireho}
6827f654740f2a26ad62a5c155af9199af9e69b889claireho
6927f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::BreakItWord250(){
7027f654740f2a26ad62a5c155af9199af9e69b889claireho    BreakItFunction* func= new BreakItFunction(250, true);
7127f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
7227f654740f2a26ad62a5c155af9199af9e69b889claireho}
7327f654740f2a26ad62a5c155af9199af9e69b889claireho
7427f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::BreakItWord10000(){
7527f654740f2a26ad62a5c155af9199af9e69b889claireho    BreakItFunction* func= new BreakItFunction(10000, true);
7627f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
7727f654740f2a26ad62a5c155af9199af9e69b889claireho}
7827f654740f2a26ad62a5c155af9199af9e69b889claireho
7927f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::BreakItChar250(){
8027f654740f2a26ad62a5c155af9199af9e69b889claireho    BreakItFunction* func= new BreakItFunction(250, false);
8127f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
8227f654740f2a26ad62a5c155af9199af9e69b889claireho}
8327f654740f2a26ad62a5c155af9199af9e69b889claireho
8427f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::BreakItChar10000(){
8527f654740f2a26ad62a5c155af9199af9e69b889claireho    BreakItFunction* func= new BreakItFunction(10000, false);
8627f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
8727f654740f2a26ad62a5c155af9199af9e69b889claireho}
8827f654740f2a26ad62a5c155af9199af9e69b889claireho
8927f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::NumFmt10000(){
9027f654740f2a26ad62a5c155af9199af9e69b889claireho    NumFmtFunction* func= new NumFmtFunction(10000, locale);
9127f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
9227f654740f2a26ad62a5c155af9199af9e69b889claireho}
9327f654740f2a26ad62a5c155af9199af9e69b889claireho
9427f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::NumFmt100000(){
9527f654740f2a26ad62a5c155af9199af9e69b889claireho    NumFmtFunction* func= new NumFmtFunction(100000, locale);
9627f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
9727f654740f2a26ad62a5c155af9199af9e69b889claireho}
9827f654740f2a26ad62a5c155af9199af9e69b889claireho
9927f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::Collation10000(){
10027f654740f2a26ad62a5c155af9199af9e69b889claireho    CollationFunction* func= new CollationFunction(40, locale);
10127f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
10227f654740f2a26ad62a5c155af9199af9e69b889claireho}
10327f654740f2a26ad62a5c155af9199af9e69b889claireho
10427f654740f2a26ad62a5c155af9199af9e69b889clairehoUPerfFunction* DateFormatPerfTest::Collation100000(){
10527f654740f2a26ad62a5c155af9199af9e69b889claireho    CollationFunction* func= new CollationFunction(400, locale);
10627f654740f2a26ad62a5c155af9199af9e69b889claireho    return func;
10727f654740f2a26ad62a5c155af9199af9e69b889claireho}
10827f654740f2a26ad62a5c155af9199af9e69b889claireho
10927f654740f2a26ad62a5c155af9199af9e69b889claireho
11027f654740f2a26ad62a5c155af9199af9e69b889claireho
11127f654740f2a26ad62a5c155af9199af9e69b889clairehoint main(int argc, const char* argv[]){
11227f654740f2a26ad62a5c155af9199af9e69b889claireho
11327f654740f2a26ad62a5c155af9199af9e69b889claireho    // -x Filename.xml
11427f654740f2a26ad62a5c155af9199af9e69b889claireho    if((argc>1)&&(strcmp(argv[1],"-x") == 0))
11527f654740f2a26ad62a5c155af9199af9e69b889claireho    {
11627f654740f2a26ad62a5c155af9199af9e69b889claireho        if(argc < 3) {
11727f654740f2a26ad62a5c155af9199af9e69b889claireho			fprintf(stderr, "Usage: %s -x <outfile>.xml\n", argv[0]);
11827f654740f2a26ad62a5c155af9199af9e69b889claireho			return 1;
11927f654740f2a26ad62a5c155af9199af9e69b889claireho			// not enough arguments
12027f654740f2a26ad62a5c155af9199af9e69b889claireho		}
12127f654740f2a26ad62a5c155af9199af9e69b889claireho
12227f654740f2a26ad62a5c155af9199af9e69b889claireho		cout << "ICU version - " << U_ICU_VERSION << endl;
12327f654740f2a26ad62a5c155af9199af9e69b889claireho        UErrorCode status = U_ZERO_ERROR;
12427f654740f2a26ad62a5c155af9199af9e69b889claireho
12583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define FUNCTION_COUNT 6
12627f654740f2a26ad62a5c155af9199af9e69b889claireho        // Declare functions
12783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        UPerfFunction *functions[FUNCTION_COUNT];
12883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
12927f654740f2a26ad62a5c155af9199af9e69b889claireho        functions[0] = new DateFmtFunction(40, "en");
13027f654740f2a26ad62a5c155af9199af9e69b889claireho        functions[1] = new BreakItFunction(10000, true); // breakIterator word
13127f654740f2a26ad62a5c155af9199af9e69b889claireho        functions[2] = new BreakItFunction(10000, false); // breakIterator char
13227f654740f2a26ad62a5c155af9199af9e69b889claireho        functions[3] = new NumFmtFunction(100000, "en");
13327f654740f2a26ad62a5c155af9199af9e69b889claireho        functions[4] = new CollationFunction(400, "en");
13483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        functions[5] = new StdioNumFmtFunction(100000, "en");
13527f654740f2a26ad62a5c155af9199af9e69b889claireho
13683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        // Perform time recording
13783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        double t[FUNCTION_COUNT];
13883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        for(int i = 0; i < FUNCTION_COUNT; i++) t[i] = 0;
13983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
14083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define ITER_COUNT 10
14183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#ifdef U_DEBUG
14283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        cout << "Doing " << ITER_COUNT << " iterations:" << endl;
14383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        cout << "__________| Running...\r";
14483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        cout.flush();
14583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif
14683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        for(int i = 0; i < ITER_COUNT; i++) {
14783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#ifdef U_DEBUG
14883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          cout << '*' << flush;
14983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif
15083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          for(int j = 0; U_SUCCESS(status)&& j < FUNCTION_COUNT; j++)
15183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius            t[j] += (functions[j]->time(1, &status) / ITER_COUNT);
15283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        }
15383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#ifdef U_DEBUG
15483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        cout << " Done                   " << endl;
15583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#endif
15627f654740f2a26ad62a5c155af9199af9e69b889claireho
15783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        if(U_SUCCESS(status)) {
15827f654740f2a26ad62a5c155af9199af9e69b889claireho
15983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          // Output results as .xml
16083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          ofstream out;
16183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          out.open(argv[2]);
16227f654740f2a26ad62a5c155af9199af9e69b889claireho
16383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          out << "<perfTestResults icu=\"c\" version=\"" << U_ICU_VERSION << "\">" << endl;
16427f654740f2a26ad62a5c155af9199af9e69b889claireho
16583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          for(int i = 0; i < FUNCTION_COUNT; i++)
16627f654740f2a26ad62a5c155af9199af9e69b889claireho            {
16783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius              out << "    <perfTestResult" << endl;
16883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius              out << "        test=\"";
16983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius              switch(i)
17083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                {
17127f654740f2a26ad62a5c155af9199af9e69b889claireho                case 0: out << "DateFormat"; break;
17227f654740f2a26ad62a5c155af9199af9e69b889claireho                case 1: out << "BreakIterator Word"; break;
17327f654740f2a26ad62a5c155af9199af9e69b889claireho                case 2: out << "BreakIterator Char"; break;
17427f654740f2a26ad62a5c155af9199af9e69b889claireho                case 3: out << "NumbFormat"; break;
17527f654740f2a26ad62a5c155af9199af9e69b889claireho                case 4: out << "Collation"; break;
17683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                case 5: out << "StdioNumbFormat"; break;
17783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                default: out << "Unknown "  << i; break;
17883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius                }
17983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius              out << "\"" << endl;
18083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius              out << "        iterations=\"" << functions[i]->getOperationsPerIteration() << "\"" << endl;
18183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius              out << "        time=\"" << t[i] << "\" />" << endl;
18227f654740f2a26ad62a5c155af9199af9e69b889claireho            }
18383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          out << "</perfTestResults>" << endl;
18483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          out.close();
18583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          cout << " Wrote to " << argv[2] << endl;
18683a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        }
18783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
18883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        if(U_FAILURE(status)) {
18983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          cout << "Error! " << u_errorName(status) << endl;
19083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius          return 1;
19127f654740f2a26ad62a5c155af9199af9e69b889claireho        }
19227f654740f2a26ad62a5c155af9199af9e69b889claireho
19327f654740f2a26ad62a5c155af9199af9e69b889claireho        return 0;
19427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
19527f654740f2a26ad62a5c155af9199af9e69b889claireho
19627f654740f2a26ad62a5c155af9199af9e69b889claireho
19727f654740f2a26ad62a5c155af9199af9e69b889claireho    // Normal performance test mode
19827f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
19927f654740f2a26ad62a5c155af9199af9e69b889claireho
20027f654740f2a26ad62a5c155af9199af9e69b889claireho    DateFormatPerfTest test(argc, argv, status);
20127f654740f2a26ad62a5c155af9199af9e69b889claireho
20227f654740f2a26ad62a5c155af9199af9e69b889claireho
20327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(status)){   // ERROR HERE!!!
20427f654740f2a26ad62a5c155af9199af9e69b889claireho		cout << "initialize failed! " << status << endl;
20527f654740f2a26ad62a5c155af9199af9e69b889claireho        return status;
20627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
20727f654740f2a26ad62a5c155af9199af9e69b889claireho	//cout << "Done initializing!\n" << endl;
20827f654740f2a26ad62a5c155af9199af9e69b889claireho
20927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(test.run()==FALSE){
21027f654740f2a26ad62a5c155af9199af9e69b889claireho		cout << "run failed!" << endl;
21127f654740f2a26ad62a5c155af9199af9e69b889claireho        fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n");
21227f654740f2a26ad62a5c155af9199af9e69b889claireho        return -1;
21327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
21427f654740f2a26ad62a5c155af9199af9e69b889claireho	cout << "done!" << endl;
21527f654740f2a26ad62a5c155af9199af9e69b889claireho
21627f654740f2a26ad62a5c155af9199af9e69b889claireho    return 0;
21783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
218