• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 **********************************************************************
3 * Copyright (c) 2002-2014,International Business Machines
4 * Corporation and others.  All Rights Reserved.
5 **********************************************************************
6 **********************************************************************
7 */
8 
9 #include "DateFmtPerf.h"
10 #include "uoptions.h"
11 #include <stdio.h>
12 #include <fstream>
13 
14 #include <iostream>
15 using namespace std;
16 
DateFormatPerfTest(int32_t argc,const char * argv[],UErrorCode & status)17 DateFormatPerfTest::DateFormatPerfTest(int32_t argc, const char* argv[], UErrorCode& status)
18 : UPerfTest(argc,argv,status) {
19 
20     if (locale == NULL){
21         locale = "en_US";   // set default locale
22     }
23 }
24 
~DateFormatPerfTest()25 DateFormatPerfTest::~DateFormatPerfTest()
26 {
27 }
28 
runIndexedTest(int32_t index,UBool exec,const char * & name,char * par)29 UPerfFunction* DateFormatPerfTest::runIndexedTest(int32_t index, UBool exec,const char* &name, char* par) {
30 
31 	//exec = true;
32 
33     switch (index) {
34         TESTCASE(0,DateFmt250);
35         TESTCASE(1,DateFmt10000);
36         TESTCASE(2,DateFmt100000);
37         TESTCASE(3,BreakItWord250);
38         TESTCASE(4,BreakItWord10000);
39         TESTCASE(5,BreakItChar250);
40         TESTCASE(6,BreakItChar10000);
41         TESTCASE(7,NumFmt10000);
42         TESTCASE(8,NumFmt100000);
43         TESTCASE(9,Collation10000);
44         TESTCASE(10,Collation100000);
45         TESTCASE(11, DIFCreate250);
46         TESTCASE(12, DIFCreate10000);
47         TESTCASE(13, TimeZoneCreate250);
48         TESTCASE(14, TimeZoneCreate10000);
49         TESTCASE(15, DTPatternGeneratorCreate250);
50         TESTCASE(16, DTPatternGeneratorCreate10000);
51         TESTCASE(17, DTPatternGeneratorCopy250);
52         TESTCASE(18, DTPatternGeneratorCopy10000);
53         TESTCASE(19, DTPatternGeneratorBestValue250);
54         TESTCASE(20, DTPatternGeneratorBestValue10000);
55         TESTCASE(21,DateFmtCopy250);
56         TESTCASE(22,DateFmtCopy10000);
57         TESTCASE(23,DateFmtCreate250);
58         TESTCASE(24,DateFmtCreate10000);
59 
60 
61         default:
62             name = "";
63             return NULL;
64     }
65     return NULL;
66 }
67 
68 
DateFmt250()69 UPerfFunction* DateFormatPerfTest::DateFmt250(){
70     DateFmtFunction* func= new DateFmtFunction(1, locale);
71     return func;
72 }
73 
DateFmt10000()74 UPerfFunction* DateFormatPerfTest::DateFmt10000(){
75     DateFmtFunction* func= new DateFmtFunction(40, locale);
76     return func;
77 }
78 
DateFmt100000()79 UPerfFunction* DateFormatPerfTest::DateFmt100000(){
80     DateFmtFunction* func= new DateFmtFunction(400, locale);
81     return func;
82 }
83 
BreakItWord250()84 UPerfFunction* DateFormatPerfTest::BreakItWord250(){
85     BreakItFunction* func= new BreakItFunction(250, true);
86     return func;
87 }
88 
BreakItWord10000()89 UPerfFunction* DateFormatPerfTest::BreakItWord10000(){
90     BreakItFunction* func= new BreakItFunction(10000, true);
91     return func;
92 }
93 
BreakItChar250()94 UPerfFunction* DateFormatPerfTest::BreakItChar250(){
95     BreakItFunction* func= new BreakItFunction(250, false);
96     return func;
97 }
98 
BreakItChar10000()99 UPerfFunction* DateFormatPerfTest::BreakItChar10000(){
100     BreakItFunction* func= new BreakItFunction(10000, false);
101     return func;
102 }
103 
NumFmt10000()104 UPerfFunction* DateFormatPerfTest::NumFmt10000(){
105     NumFmtFunction* func= new NumFmtFunction(10000, locale);
106     return func;
107 }
108 
NumFmt100000()109 UPerfFunction* DateFormatPerfTest::NumFmt100000(){
110     NumFmtFunction* func= new NumFmtFunction(100000, locale);
111     return func;
112 }
113 
Collation10000()114 UPerfFunction* DateFormatPerfTest::Collation10000(){
115     CollationFunction* func= new CollationFunction(40, locale);
116     return func;
117 }
118 
Collation100000()119 UPerfFunction* DateFormatPerfTest::Collation100000(){
120     CollationFunction* func= new CollationFunction(400, locale);
121     return func;
122 }
123 
124 
DIFCreate250()125 UPerfFunction *DateFormatPerfTest::DIFCreate250() {
126     DIFCreateFunction* func = new DIFCreateFunction(250, locale);
127     return func;
128 }
129 
DIFCreate10000()130 UPerfFunction *DateFormatPerfTest::DIFCreate10000() {
131     DIFCreateFunction* func = new DIFCreateFunction(10000, locale);
132     return func;
133 }
134 
TimeZoneCreate250()135 UPerfFunction *DateFormatPerfTest::TimeZoneCreate250() {
136     return new TimeZoneCreateFunction(250, locale);
137 }
138 
TimeZoneCreate10000()139 UPerfFunction *DateFormatPerfTest::TimeZoneCreate10000() {
140     return new TimeZoneCreateFunction(10000, locale);
141 }
142 
DTPatternGeneratorCreate250()143 UPerfFunction *DateFormatPerfTest::DTPatternGeneratorCreate250() {
144     return new DTPatternGeneratorCreateFunction(250, locale);
145 }
146 
DTPatternGeneratorCreate10000()147 UPerfFunction *DateFormatPerfTest::DTPatternGeneratorCreate10000() {
148     return new DTPatternGeneratorCreateFunction(10000, locale);
149 }
150 
DTPatternGeneratorCopy250()151 UPerfFunction *DateFormatPerfTest::DTPatternGeneratorCopy250() {
152     return new DTPatternGeneratorCopyFunction(250, locale);
153 }
154 
DTPatternGeneratorCopy10000()155 UPerfFunction *DateFormatPerfTest::DTPatternGeneratorCopy10000() {
156     return new DTPatternGeneratorCopyFunction(10000, locale);
157 }
158 
DTPatternGeneratorBestValue250()159 UPerfFunction *DateFormatPerfTest::DTPatternGeneratorBestValue250() {
160     return new DTPatternGeneratorBestValueFunction(250, locale);
161 }
162 
DTPatternGeneratorBestValue10000()163 UPerfFunction *DateFormatPerfTest::DTPatternGeneratorBestValue10000() {
164     return new DTPatternGeneratorBestValueFunction(10000, locale);
165 }
166 
DateFmtCopy250()167 UPerfFunction* DateFormatPerfTest::DateFmtCopy250(){
168     return new DateFmtCopyFunction(250, locale);
169 }
170 
DateFmtCopy10000()171 UPerfFunction* DateFormatPerfTest::DateFmtCopy10000(){
172     return new DateFmtCopyFunction(10000, locale);
173 }
174 
DateFmtCreate250()175 UPerfFunction* DateFormatPerfTest::DateFmtCreate250(){
176     return new DateFmtCreateFunction(250, locale);
177 }
178 
DateFmtCreate10000()179 UPerfFunction* DateFormatPerfTest::DateFmtCreate10000(){
180     return new DateFmtCreateFunction(10000, locale);
181 }
182 
183 
main(int argc,const char * argv[])184 int main(int argc, const char* argv[]){
185 
186     // -x Filename.xml
187     if((argc>1)&&(strcmp(argv[1],"-x") == 0))
188     {
189         if(argc < 3) {
190 			fprintf(stderr, "Usage: %s -x <outfile>.xml\n", argv[0]);
191 			return 1;
192 			// not enough arguments
193 		}
194 
195 		cout << "ICU version - " << U_ICU_VERSION << endl;
196         UErrorCode status = U_ZERO_ERROR;
197 
198 #define FUNCTION_COUNT 6
199         // Declare functions
200         UPerfFunction *functions[FUNCTION_COUNT];
201 
202         functions[0] = new DateFmtFunction(40, "en");
203         functions[1] = new BreakItFunction(10000, true); // breakIterator word
204         functions[2] = new BreakItFunction(10000, false); // breakIterator char
205         functions[3] = new NumFmtFunction(100000, "en");
206         functions[4] = new CollationFunction(400, "en");
207         functions[5] = new StdioNumFmtFunction(100000, "en");
208 
209         // Perform time recording
210         double t[FUNCTION_COUNT];
211         for(int i = 0; i < FUNCTION_COUNT; i++) t[i] = 0;
212 
213 #define ITER_COUNT 10
214 #ifdef U_DEBUG
215         cout << "Doing " << ITER_COUNT << " iterations:" << endl;
216         cout << "__________| Running...\r";
217         cout.flush();
218 #endif
219         for(int i = 0; i < ITER_COUNT; i++) {
220 #ifdef U_DEBUG
221           cout << '*' << flush;
222 #endif
223           for(int j = 0; U_SUCCESS(status)&& j < FUNCTION_COUNT; j++)
224             t[j] += (functions[j]->time(1, &status) / ITER_COUNT);
225         }
226 #ifdef U_DEBUG
227         cout << " Done                   " << endl;
228 #endif
229 
230         if(U_SUCCESS(status)) {
231 
232           // Output results as .xml
233           ofstream out;
234           out.open(argv[2]);
235 
236           out << "<perfTestResults icu=\"c\" version=\"" << U_ICU_VERSION << "\">" << endl;
237 
238           for(int i = 0; i < FUNCTION_COUNT; i++)
239             {
240               out << "    <perfTestResult" << endl;
241               out << "        test=\"";
242               switch(i)
243                 {
244                 case 0: out << "DateFormat"; break;
245                 case 1: out << "BreakIterator Word"; break;
246                 case 2: out << "BreakIterator Char"; break;
247                 case 3: out << "NumbFormat"; break;
248                 case 4: out << "Collation"; break;
249                 case 5: out << "StdioNumbFormat"; break;
250                 default: out << "Unknown "  << i; break;
251                 }
252               out << "\"" << endl;
253               out << "        iterations=\"" << functions[i]->getOperationsPerIteration() << "\"" << endl;
254               out << "        time=\"" << t[i] << "\" />" << endl;
255             }
256           out << "</perfTestResults>" << endl;
257           out.close();
258           cout << " Wrote to " << argv[2] << endl;
259         }
260 
261         if(U_FAILURE(status)) {
262           cout << "Error! " << u_errorName(status) << endl;
263           return 1;
264         }
265 
266         return 0;
267     }
268 
269 
270     // Normal performance test mode
271     UErrorCode status = U_ZERO_ERROR;
272 
273     DateFormatPerfTest test(argc, argv, status);
274 
275 
276     if(U_FAILURE(status)){   // ERROR HERE!!!
277 		cout << "initialize failed! " << status << endl;
278         return status;
279     }
280 	//cout << "Done initializing!\n" << endl;
281 
282     if(test.run()==FALSE){
283 		cout << "run failed!" << endl;
284         fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n");
285         return -1;
286     }
287 	cout << "done!" << endl;
288 
289     return 0;
290 }
291