/*
**********************************************************************
* Copyright (c) 2002-2011,International Business Machines
* Corporation and others. All Rights Reserved.
**********************************************************************
**********************************************************************
*/
#include "DateFmtPerf.h"
#include "uoptions.h"
#include <stdio.h>
#include <fstream>
#include <iostream>
using namespace std;
DateFormatPerfTest::DateFormatPerfTest(int32_t argc, const char* argv[], UErrorCode& status)
: UPerfTest(argc,argv,status) {
if (locale == NULL){
locale = "en_US"; // set default locale
}
}
DateFormatPerfTest::~DateFormatPerfTest()
{
}
UPerfFunction* DateFormatPerfTest::runIndexedTest(int32_t index, UBool exec,const char* &name, char* par) {
//exec = true;
switch (index) {
TESTCASE(0,DateFmt250);
TESTCASE(1,DateFmt10000);
TESTCASE(2,DateFmt100000);
TESTCASE(3,BreakItWord250);
TESTCASE(4,BreakItWord10000);
TESTCASE(5,BreakItChar250);
TESTCASE(6,BreakItChar10000);
TESTCASE(7,NumFmt10000);
TESTCASE(8,NumFmt100000);
TESTCASE(9,Collation10000);
TESTCASE(10,Collation100000);
default:
name = "";
return NULL;
}
return NULL;
}
UPerfFunction* DateFormatPerfTest::DateFmt250(){
DateFmtFunction* func= new DateFmtFunction(1, locale);
return func;
}
UPerfFunction* DateFormatPerfTest::DateFmt10000(){
DateFmtFunction* func= new DateFmtFunction(40, locale);
return func;
}
UPerfFunction* DateFormatPerfTest::DateFmt100000(){
DateFmtFunction* func= new DateFmtFunction(400, locale);
return func;
}
UPerfFunction* DateFormatPerfTest::BreakItWord250(){
BreakItFunction* func= new BreakItFunction(250, true);
return func;
}
UPerfFunction* DateFormatPerfTest::BreakItWord10000(){
BreakItFunction* func= new BreakItFunction(10000, true);
return func;
}
UPerfFunction* DateFormatPerfTest::BreakItChar250(){
BreakItFunction* func= new BreakItFunction(250, false);
return func;
}
UPerfFunction* DateFormatPerfTest::BreakItChar10000(){
BreakItFunction* func= new BreakItFunction(10000, false);
return func;
}
UPerfFunction* DateFormatPerfTest::NumFmt10000(){
NumFmtFunction* func= new NumFmtFunction(10000, locale);
return func;
}
UPerfFunction* DateFormatPerfTest::NumFmt100000(){
NumFmtFunction* func= new NumFmtFunction(100000, locale);
return func;
}
UPerfFunction* DateFormatPerfTest::Collation10000(){
CollationFunction* func= new CollationFunction(40, locale);
return func;
}
UPerfFunction* DateFormatPerfTest::Collation100000(){
CollationFunction* func= new CollationFunction(400, locale);
return func;
}
int main(int argc, const char* argv[]){
// -x Filename.xml
if((argc>1)&&(strcmp(argv[1],"-x") == 0))
{
if(argc < 3) {
fprintf(stderr, "Usage: %s -x <outfile>.xml\n", argv[0]);
return 1;
// not enough arguments
}
cout << "ICU version - " << U_ICU_VERSION << endl;
UErrorCode status = U_ZERO_ERROR;
#define FUNCTION_COUNT 6
// Declare functions
UPerfFunction *functions[FUNCTION_COUNT];
functions[0] = new DateFmtFunction(40, "en");
functions[1] = new BreakItFunction(10000, true); // breakIterator word
functions[2] = new BreakItFunction(10000, false); // breakIterator char
functions[3] = new NumFmtFunction(100000, "en");
functions[4] = new CollationFunction(400, "en");
functions[5] = new StdioNumFmtFunction(100000, "en");
// Perform time recording
double t[FUNCTION_COUNT];
for(int i = 0; i < FUNCTION_COUNT; i++) t[i] = 0;
#define ITER_COUNT 10
#ifdef U_DEBUG
cout << "Doing " << ITER_COUNT << " iterations:" << endl;
cout << "__________| Running...\r";
cout.flush();
#endif
for(int i = 0; i < ITER_COUNT; i++) {
#ifdef U_DEBUG
cout << '*' << flush;
#endif
for(int j = 0; U_SUCCESS(status)&& j < FUNCTION_COUNT; j++)
t[j] += (functions[j]->time(1, &status) / ITER_COUNT);
}
#ifdef U_DEBUG
cout << " Done " << endl;
#endif
if(U_SUCCESS(status)) {
// Output results as .xml
ofstream out;
out.open(argv[2]);
out << "<perfTestResults icu=\"c\" version=\"" << U_ICU_VERSION << "\">" << endl;
for(int i = 0; i < FUNCTION_COUNT; i++)
{
out << " <perfTestResult" << endl;
out << " test=\"";
switch(i)
{
case 0: out << "DateFormat"; break;
case 1: out << "BreakIterator Word"; break;
case 2: out << "BreakIterator Char"; break;
case 3: out << "NumbFormat"; break;
case 4: out << "Collation"; break;
case 5: out << "StdioNumbFormat"; break;
default: out << "Unknown " << i; break;
}
out << "\"" << endl;
out << " iterations=\"" << functions[i]->getOperationsPerIteration() << "\"" << endl;
out << " time=\"" << t[i] << "\" />" << endl;
}
out << "</perfTestResults>" << endl;
out.close();
cout << " Wrote to " << argv[2] << endl;
}
if(U_FAILURE(status)) {
cout << "Error! " << u_errorName(status) << endl;
return 1;
}
return 0;
}
// Normal performance test mode
UErrorCode status = U_ZERO_ERROR;
DateFormatPerfTest test(argc, argv, status);
if(U_FAILURE(status)){ // ERROR HERE!!!
cout << "initialize failed! " << status << endl;
return status;
}
//cout << "Done initializing!\n" << endl;
if(test.run()==FALSE){
cout << "run failed!" << endl;
fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n");
return -1;
}
cout << "done!" << endl;
return 0;
}