2 **********************************************************************
3 * Copyright (c) 2002-2016, International Business Machines
4 * Corporation and others. All Rights Reserved.
5 **********************************************************************
6 **********************************************************************
9 * This Program tests the performance of ICU's Normalization engine against Windows
10 * to run it use the command like
12 * c:\normperf.exe -s C:\work\ICUCupertinoRep\icu4c\collation-perf-data -i 10 -p 15 -f TestNames_Asian.txt -u -e UTF-8 -l
16 #include "cmemory.h" // for UPRV_LENGTHOF
19 UPerfFunction
* NormalizerPerformanceTest::runIndexedTest(int32_t index
, UBool exec
,const char* &name
, char* par
) {
21 TESTCASE(0,TestICU_NFC_NFD_Text
);
22 TESTCASE(1,TestICU_NFC_NFC_Text
);
23 TESTCASE(2,TestICU_NFC_Orig_Text
);
25 TESTCASE(3,TestICU_NFD_NFD_Text
);
26 TESTCASE(4,TestICU_NFD_NFC_Text
);
27 TESTCASE(5,TestICU_NFD_Orig_Text
);
29 TESTCASE(6,TestICU_FCD_NFD_Text
);
30 TESTCASE(7,TestICU_FCD_NFC_Text
);
31 TESTCASE(8,TestICU_FCD_Orig_Text
);
33 TESTCASE(9,TestWin_NFC_NFD_Text
);
34 TESTCASE(10,TestWin_NFC_NFC_Text
);
35 TESTCASE(11,TestWin_NFC_Orig_Text
);
37 TESTCASE(12,TestWin_NFD_NFD_Text
);
38 TESTCASE(13,TestWin_NFD_NFC_Text
);
39 TESTCASE(14,TestWin_NFD_Orig_Text
);
41 TESTCASE(15,TestQC_NFC_NFD_Text
);
42 TESTCASE(16,TestQC_NFC_NFC_Text
);
43 TESTCASE(17,TestQC_NFC_Orig_Text
);
45 TESTCASE(18,TestQC_NFD_NFD_Text
);
46 TESTCASE(19,TestQC_NFD_NFC_Text
);
47 TESTCASE(20,TestQC_NFD_Orig_Text
);
49 TESTCASE(21,TestQC_FCD_NFD_Text
);
50 TESTCASE(22,TestQC_FCD_NFC_Text
);
51 TESTCASE(23,TestQC_FCD_Orig_Text
);
53 TESTCASE(24,TestIsNormalized_NFC_NFD_Text
);
54 TESTCASE(25,TestIsNormalized_NFC_NFC_Text
);
55 TESTCASE(26,TestIsNormalized_NFC_Orig_Text
);
57 TESTCASE(27,TestIsNormalized_NFD_NFD_Text
);
58 TESTCASE(28,TestIsNormalized_NFD_NFC_Text
);
59 TESTCASE(29,TestIsNormalized_NFD_Orig_Text
);
61 TESTCASE(30,TestIsNormalized_FCD_NFD_Text
);
62 TESTCASE(31,TestIsNormalized_FCD_NFC_Text
);
63 TESTCASE(32,TestIsNormalized_FCD_Orig_Text
);
73 void NormalizerPerformanceTest::normalizeInput(ULine
* dest
,const UChar
* src
,int32_t srcLen
,UNormalizationMode mode
, int32_t options
){
75 UErrorCode status
= U_ZERO_ERROR
;
78 reqLen
=unorm_normalize(src
,srcLen
,mode
, options
,NULL
,0,&status
);
79 if(status
==U_BUFFER_OVERFLOW_ERROR
){
81 dest
->name
= new UChar
[reqLen
+1];
82 reqLen
= unorm_normalize(src
,srcLen
,mode
, options
,dest
->name
,reqLen
+1,&status
);
85 }else if(U_FAILURE(status
)){
86 printf("Could not normalize input. Error: %s", u_errorName(status
));
90 UChar
* NormalizerPerformanceTest::normalizeInput(int32_t& len
, const UChar
* src
,int32_t srcLen
,UNormalizationMode mode
, int32_t options
){
92 UErrorCode status
= U_ZERO_ERROR
;
96 reqLen
=unorm_normalize(src
,srcLen
,mode
, options
,NULL
,0,&status
);
97 if(status
==U_BUFFER_OVERFLOW_ERROR
){
99 dest
= new UChar
[reqLen
+1];
100 reqLen
= unorm_normalize(src
,srcLen
,mode
, options
,dest
,reqLen
+1,&status
);
103 }else if(U_FAILURE(status
)){
104 printf("Could not normalize input. Error: %s", u_errorName(status
));
111 static UOption cmdLineOptions
[]={
112 UOPTION_DEF("options", 'o', UOPT_OPTIONAL_ARG
)
115 NormalizerPerformanceTest::NormalizerPerformanceTest(int32_t argc
, const char* argv
[], UErrorCode
& status
)
116 : UPerfTest(argc
,argv
,status
), options(0) {
124 if(status
== U_ILLEGAL_ARGUMENT_ERROR
){
125 fprintf(stderr
,gUsageString
, "normperf");
129 if(U_FAILURE(status
)){
130 fprintf(stderr
, "FAILED to create UPerfTest object. Error: %s\n", u_errorName(status
));
134 _remainingArgc
= u_parseArgs(_remainingArgc
, (char **)argv
, UPRV_LENGTHOF(cmdLineOptions
), cmdLineOptions
);
135 if(cmdLineOptions
[0].doesOccur
&& cmdLineOptions
[0].value
!=NULL
) {
136 options
=(int32_t)strtol(cmdLineOptions
[0].value
, NULL
, 16);
140 ULine
* filelines
= getLines(status
);
141 if(U_FAILURE(status
)){
142 fprintf(stderr
, "FAILED to read lines from file and create UPerfTest object. Error: %s\n", u_errorName(status
));
145 NFDFileLines
= new ULine
[numLines
];
146 NFCFileLines
= new ULine
[numLines
];
148 for(int32_t i
=0;i
<numLines
;i
++){
149 normalizeInput(&NFDFileLines
[i
],filelines
[i
].name
,filelines
[i
].len
,UNORM_NFD
, options
);
150 normalizeInput(&NFCFileLines
[i
],filelines
[i
].name
,filelines
[i
].len
,UNORM_NFC
, options
);
155 const UChar
* src
= getBuffer(srcLen
,status
);
159 if(U_FAILURE(status
)){
160 fprintf(stderr
, "FAILED to read buffer from file and create UPerfTest object. Error: %s\n", u_errorName(status
));
164 NFDBuffer
= normalizeInput(NFDBufferLen
,src
,srcLen
,UNORM_NFD
, options
);
165 NFCBuffer
= normalizeInput(NFCBufferLen
,src
,srcLen
,UNORM_NFC
, options
);
170 NormalizerPerformanceTest::~NormalizerPerformanceTest(){
171 delete[] NFDFileLines
;
172 delete[] NFCFileLines
;
177 // Test NFC Performance
178 UPerfFunction
* NormalizerPerformanceTest::TestICU_NFC_NFD_Text(){
180 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFC
, options
,NFDFileLines
,numLines
, uselen
);
183 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFC
, options
,NFDBuffer
, NFDBufferLen
, uselen
);
187 UPerfFunction
* NormalizerPerformanceTest::TestICU_NFC_NFC_Text(){
189 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFC
, options
,NFCFileLines
,numLines
, uselen
);
192 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFC
, options
,NFCBuffer
, NFCBufferLen
, uselen
);
196 UPerfFunction
* NormalizerPerformanceTest::TestICU_NFC_Orig_Text(){
198 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFC
, options
,lines
,numLines
, uselen
);
201 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFC
, options
,buffer
, bufferLen
, uselen
);
206 // Test NFD Performance
207 UPerfFunction
* NormalizerPerformanceTest::TestICU_NFD_NFD_Text(){
209 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFD
, options
,NFDFileLines
,numLines
, uselen
);
212 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFD
, options
,NFDBuffer
,NFDBufferLen
, uselen
);
216 UPerfFunction
* NormalizerPerformanceTest::TestICU_NFD_NFC_Text(){
218 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFD
, options
,NFCFileLines
,numLines
, uselen
);
221 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFD
, options
,NFCBuffer
,NFCBufferLen
, uselen
);
225 UPerfFunction
* NormalizerPerformanceTest::TestICU_NFD_Orig_Text(){
227 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFD
, options
,lines
,numLines
, uselen
);
230 NormPerfFunction
* func
= new NormPerfFunction(ICUNormNFD
, options
,buffer
,bufferLen
, uselen
);
235 // Test FCD Performance
236 UPerfFunction
* NormalizerPerformanceTest::TestICU_FCD_NFD_Text(){
238 NormPerfFunction
* func
= new NormPerfFunction(ICUNormFCD
, options
,NFDFileLines
,numLines
, uselen
);
241 NormPerfFunction
* func
= new NormPerfFunction(ICUNormFCD
, options
,NFDBuffer
,NFDBufferLen
, uselen
);
246 UPerfFunction
* NormalizerPerformanceTest::TestICU_FCD_NFC_Text(){
248 NormPerfFunction
* func
= new NormPerfFunction(ICUNormFCD
, options
,NFCFileLines
,numLines
, uselen
);
251 NormPerfFunction
* func
= new NormPerfFunction(ICUNormFCD
, options
,NFCBuffer
,NFCBufferLen
, uselen
);
255 UPerfFunction
* NormalizerPerformanceTest::TestICU_FCD_Orig_Text(){
257 NormPerfFunction
* func
= new NormPerfFunction(ICUNormFCD
, options
,lines
,numLines
, uselen
);
260 NormPerfFunction
* func
= new NormPerfFunction(ICUNormFCD
, options
,buffer
,bufferLen
, uselen
);
265 // Test Win NFC Performance
266 UPerfFunction
* NormalizerPerformanceTest::TestWin_NFC_NFD_Text(){
268 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFC
, options
,NFDFileLines
,numLines
, uselen
);
271 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFC
, options
,NFDBuffer
,NFDBufferLen
, uselen
);
275 UPerfFunction
* NormalizerPerformanceTest::TestWin_NFC_NFC_Text(){
277 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFC
, options
,NFCFileLines
,numLines
, uselen
);
280 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFC
, options
,NFCBuffer
,NFCBufferLen
, uselen
);
284 UPerfFunction
* NormalizerPerformanceTest::TestWin_NFC_Orig_Text(){
286 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFC
, options
,lines
,numLines
, uselen
);
289 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFC
, options
,buffer
,bufferLen
, uselen
);
294 // Test Win NFD Performance
295 UPerfFunction
* NormalizerPerformanceTest::TestWin_NFD_NFD_Text(){
297 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFD
, options
,NFDFileLines
,numLines
, uselen
);
300 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFD
, options
,NFDBuffer
,NFDBufferLen
, uselen
);
304 UPerfFunction
* NormalizerPerformanceTest::TestWin_NFD_NFC_Text(){
306 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFD
, options
,NFCFileLines
,numLines
, uselen
);
309 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFD
, options
,NFCBuffer
,NFCBufferLen
, uselen
);
313 UPerfFunction
* NormalizerPerformanceTest::TestWin_NFD_Orig_Text(){
315 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFD
, options
,lines
,numLines
, uselen
);
318 NormPerfFunction
* func
= new NormPerfFunction(WinNormNFD
, options
,buffer
,bufferLen
, uselen
);
323 // Test Quick Check Performance
324 UPerfFunction
* NormalizerPerformanceTest::TestQC_NFC_NFD_Text(){
326 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFDFileLines
, numLines
, UNORM_NFC
, options
,uselen
);
329 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFDBuffer
, NFDBufferLen
, UNORM_NFC
, options
,uselen
);
333 UPerfFunction
* NormalizerPerformanceTest::TestQC_NFC_NFC_Text(){
335 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFCFileLines
, numLines
, UNORM_NFC
, options
,uselen
);
338 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFCBuffer
, NFCBufferLen
, UNORM_NFC
, options
,uselen
);
342 UPerfFunction
* NormalizerPerformanceTest::TestQC_NFC_Orig_Text(){
344 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,lines
, numLines
, UNORM_NFC
, options
,uselen
);
347 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,buffer
, bufferLen
, UNORM_NFC
, options
,uselen
);
352 UPerfFunction
* NormalizerPerformanceTest::TestQC_NFD_NFD_Text(){
354 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFDFileLines
, numLines
, UNORM_NFD
, options
,uselen
);
357 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFDBuffer
, NFDBufferLen
, UNORM_NFD
, options
,uselen
);
361 UPerfFunction
* NormalizerPerformanceTest::TestQC_NFD_NFC_Text(){
363 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFCFileLines
, numLines
, UNORM_NFD
, options
,uselen
);
366 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFCBuffer
, NFCBufferLen
, UNORM_NFD
, options
,uselen
);
370 UPerfFunction
* NormalizerPerformanceTest::TestQC_NFD_Orig_Text(){
372 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,lines
, numLines
, UNORM_NFD
, options
,uselen
);
375 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,buffer
, bufferLen
, UNORM_NFD
, options
,uselen
);
380 UPerfFunction
* NormalizerPerformanceTest::TestQC_FCD_NFD_Text(){
382 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFDFileLines
, numLines
, UNORM_FCD
, options
,uselen
);
385 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFDBuffer
, NFDBufferLen
, UNORM_FCD
, options
,uselen
);
389 UPerfFunction
* NormalizerPerformanceTest::TestQC_FCD_NFC_Text(){
391 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFCFileLines
, numLines
, UNORM_FCD
, options
,uselen
);
394 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,NFCBuffer
, NFCBufferLen
, UNORM_FCD
, options
,uselen
);
398 UPerfFunction
* NormalizerPerformanceTest::TestQC_FCD_Orig_Text(){
400 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,lines
, numLines
, UNORM_FCD
, options
,uselen
);
403 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUQuickCheck
,buffer
, bufferLen
, UNORM_FCD
, options
,uselen
);
408 // Test isNormalized Performance
409 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_NFC_NFD_Text(){
411 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFDFileLines
, numLines
, UNORM_NFC
, options
,uselen
);
414 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFDBuffer
, NFDBufferLen
, UNORM_NFC
, options
,uselen
);
418 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_NFC_NFC_Text(){
420 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFCFileLines
, numLines
, UNORM_NFC
, options
,uselen
);
423 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFCBuffer
, NFCBufferLen
, UNORM_NFC
, options
,uselen
);
427 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_NFC_Orig_Text(){
429 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,lines
, numLines
, UNORM_NFC
, options
,uselen
);
432 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,buffer
, bufferLen
, UNORM_NFC
, options
,uselen
);
437 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_NFD_NFD_Text(){
439 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFDFileLines
, numLines
, UNORM_NFD
, options
,uselen
);
442 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFDBuffer
, NFDBufferLen
, UNORM_NFD
, options
,uselen
);
446 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_NFD_NFC_Text(){
448 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFCFileLines
, numLines
, UNORM_NFD
, options
,uselen
);
451 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFCBuffer
, NFCBufferLen
, UNORM_NFD
, options
,uselen
);
455 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_NFD_Orig_Text(){
457 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,lines
, numLines
, UNORM_NFD
, options
,uselen
);
460 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,buffer
, bufferLen
, UNORM_NFD
, options
,uselen
);
465 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_FCD_NFD_Text(){
467 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFDFileLines
, numLines
, UNORM_FCD
, options
,uselen
);
470 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFDBuffer
, NFDBufferLen
, UNORM_FCD
, options
,uselen
);
474 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_FCD_NFC_Text(){
476 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFCFileLines
, numLines
, UNORM_FCD
, options
,uselen
);
479 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,NFCBuffer
, NFCBufferLen
, UNORM_FCD
, options
,uselen
);
483 UPerfFunction
* NormalizerPerformanceTest::TestIsNormalized_FCD_Orig_Text(){
485 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,lines
, numLines
, UNORM_FCD
, options
,uselen
);
488 QuickCheckPerfFunction
* func
= new QuickCheckPerfFunction(ICUIsNormalized
,buffer
, bufferLen
, UNORM_FCD
, options
,uselen
);
493 int main(int argc
, const char* argv
[]){
494 UErrorCode status
= U_ZERO_ERROR
;
495 NormalizerPerformanceTest
test(argc
, argv
, status
);
496 if(U_FAILURE(status
)){
499 if(test
.run()==FALSE
){
500 fprintf(stderr
,"FAILED: Tests could not be run please check the arguments.\n");