/*
***********************************************************************
* © 2016 and later: Unicode, Inc. and others.
* License & terms of use: http://www.unicode.org/copyright.html#License
***********************************************************************
***********************************************************************
* Copyright (c) 2002-2016, International Business Machines
* Corporation and others. All Rights Reserved.
***********************************************************************
***********************************************************************
*/
/**
* This Program tests the performance of ICU's Normalization engine against Windows
* to run it use the command like
*
* c:\normperf.exe -s C:\work\ICUCupertinoRep\icu4c\collation-perf-data -i 10 -p 15 -f TestNames_Asian.txt -u -e UTF-8 -l
*/
#include "normperf.h"
#include "uoptions.h"
#include "cmemory.h" // for UPRV_LENGTHOF
#include <stdio.h>
UPerfFunction* NormalizerPerformanceTest::runIndexedTest(int32_t index, UBool exec,const char* &name, char* par) {
switch (index) {
TESTCASE(0,TestICU_NFC_NFD_Text);
TESTCASE(1,TestICU_NFC_NFC_Text);
TESTCASE(2,TestICU_NFC_Orig_Text);
TESTCASE(3,TestICU_NFD_NFD_Text);
TESTCASE(4,TestICU_NFD_NFC_Text);
TESTCASE(5,TestICU_NFD_Orig_Text);
TESTCASE(6,TestICU_FCD_NFD_Text);
TESTCASE(7,TestICU_FCD_NFC_Text);
TESTCASE(8,TestICU_FCD_Orig_Text);
TESTCASE(9,TestWin_NFC_NFD_Text);
TESTCASE(10,TestWin_NFC_NFC_Text);
TESTCASE(11,TestWin_NFC_Orig_Text);
TESTCASE(12,TestWin_NFD_NFD_Text);
TESTCASE(13,TestWin_NFD_NFC_Text);
TESTCASE(14,TestWin_NFD_Orig_Text);
TESTCASE(15,TestQC_NFC_NFD_Text);
TESTCASE(16,TestQC_NFC_NFC_Text);
TESTCASE(17,TestQC_NFC_Orig_Text);
TESTCASE(18,TestQC_NFD_NFD_Text);
TESTCASE(19,TestQC_NFD_NFC_Text);
TESTCASE(20,TestQC_NFD_Orig_Text);
TESTCASE(21,TestQC_FCD_NFD_Text);
TESTCASE(22,TestQC_FCD_NFC_Text);
TESTCASE(23,TestQC_FCD_Orig_Text);
TESTCASE(24,TestIsNormalized_NFC_NFD_Text);
TESTCASE(25,TestIsNormalized_NFC_NFC_Text);
TESTCASE(26,TestIsNormalized_NFC_Orig_Text);
TESTCASE(27,TestIsNormalized_NFD_NFD_Text);
TESTCASE(28,TestIsNormalized_NFD_NFC_Text);
TESTCASE(29,TestIsNormalized_NFD_Orig_Text);
TESTCASE(30,TestIsNormalized_FCD_NFD_Text);
TESTCASE(31,TestIsNormalized_FCD_NFC_Text);
TESTCASE(32,TestIsNormalized_FCD_Orig_Text);
default:
name = "";
return NULL;
}
return NULL;
}
void NormalizerPerformanceTest::normalizeInput(ULine* dest,const UChar* src ,int32_t srcLen,UNormalizationMode mode, int32_t options){
int32_t reqLen = 0;
UErrorCode status = U_ZERO_ERROR;
for(;;){
/* pure pre-flight */
reqLen=unorm_normalize(src,srcLen,mode, options,NULL,0,&status);
if(status==U_BUFFER_OVERFLOW_ERROR){
status=U_ZERO_ERROR;
dest->name = new UChar[reqLen+1];
reqLen= unorm_normalize(src,srcLen,mode, options,dest->name,reqLen+1,&status);
dest->len=reqLen;
break;
}else if(U_FAILURE(status)){
printf("Could not normalize input. Error: %s", u_errorName(status));
}
}
}
UChar* NormalizerPerformanceTest::normalizeInput(int32_t& len, const UChar* src ,int32_t srcLen,UNormalizationMode mode, int32_t options){
int32_t reqLen = 0;
UErrorCode status = U_ZERO_ERROR;
UChar* dest = NULL;
for(;;){
/* pure pre-flight */
reqLen=unorm_normalize(src,srcLen,mode, options,NULL,0,&status);
if(status==U_BUFFER_OVERFLOW_ERROR){
status=U_ZERO_ERROR;
dest = new UChar[reqLen+1];
reqLen= unorm_normalize(src,srcLen,mode, options,dest,reqLen+1,&status);
len=reqLen;
break;
}else if(U_FAILURE(status)){
printf("Could not normalize input. Error: %s", u_errorName(status));
return NULL;
}
}
return dest;
}
static UOption cmdLineOptions[]={
UOPTION_DEF("options", 'o', UOPT_OPTIONAL_ARG)
};
NormalizerPerformanceTest::NormalizerPerformanceTest(int32_t argc, const char* argv[], UErrorCode& status)
: UPerfTest(argc,argv,status), options(0) {
NFDBuffer = NULL;
NFCBuffer = NULL;
NFDBufferLen = 0;
NFCBufferLen = 0;
NFDFileLines = NULL;
NFCFileLines = NULL;
if(status== U_ILLEGAL_ARGUMENT_ERROR){
fprintf(stderr,gUsageString, "normperf");
return;
}
if(U_FAILURE(status)){
fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", u_errorName(status));
return;
}
_remainingArgc = u_parseArgs(_remainingArgc, (char **)argv, UPRV_LENGTHOF(cmdLineOptions), cmdLineOptions);
if(cmdLineOptions[0].doesOccur && cmdLineOptions[0].value!=NULL) {
options=(int32_t)strtol(cmdLineOptions[0].value, NULL, 16);
}
if(line_mode){
ULine* filelines = getLines(status);
if(U_FAILURE(status)){
fprintf(stderr, "FAILED to read lines from file and create UPerfTest object. Error: %s\n", u_errorName(status));
return;
}
NFDFileLines = new ULine[numLines];
NFCFileLines = new ULine[numLines];
for(int32_t i=0;i<numLines;i++){
normalizeInput(&NFDFileLines[i],filelines[i].name,filelines[i].len,UNORM_NFD, options);
normalizeInput(&NFCFileLines[i],filelines[i].name,filelines[i].len,UNORM_NFC, options);
}
}else if(bulk_mode){
int32_t srcLen = 0;
const UChar* src = getBuffer(srcLen,status);
NFDBufferLen = 0;
NFCBufferLen = 0;
if(U_FAILURE(status)){
fprintf(stderr, "FAILED to read buffer from file and create UPerfTest object. Error: %s\n", u_errorName(status));
return;
}
NFDBuffer = normalizeInput(NFDBufferLen,src,srcLen,UNORM_NFD, options);
NFCBuffer = normalizeInput(NFCBufferLen,src,srcLen,UNORM_NFC, options);
}
}
NormalizerPerformanceTest::~NormalizerPerformanceTest(){
delete[] NFDFileLines;
delete[] NFCFileLines;
delete[] NFDBuffer;
delete[] NFCBuffer;
}
// Test NFC Performance
UPerfFunction* NormalizerPerformanceTest::TestICU_NFC_NFD_Text(){
if(line_mode){
NormPerfFunction* func= new NormPerfFunction(ICUNormNFC, options,NFDFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func= new NormPerfFunction(ICUNormNFC, options,NFDBuffer, NFDBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestICU_NFC_NFC_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(ICUNormNFC, options,NFCFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func= new NormPerfFunction(ICUNormNFC, options,NFCBuffer, NFCBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestICU_NFC_Orig_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(ICUNormNFC, options,lines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(ICUNormNFC, options,buffer, bufferLen, uselen);
return func;
}
}
// Test NFD Performance
UPerfFunction* NormalizerPerformanceTest::TestICU_NFD_NFD_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(ICUNormNFD, options,NFDFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(ICUNormNFD, options,NFDBuffer,NFDBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestICU_NFD_NFC_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(ICUNormNFD, options,NFCFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(ICUNormNFD, options,NFCBuffer,NFCBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestICU_NFD_Orig_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(ICUNormNFD, options,lines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(ICUNormNFD, options,buffer,bufferLen, uselen);
return func;
}
}
// Test FCD Performance
UPerfFunction* NormalizerPerformanceTest::TestICU_FCD_NFD_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(ICUNormFCD, options,NFDFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(ICUNormFCD, options,NFDBuffer,NFDBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestICU_FCD_NFC_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(ICUNormFCD, options,NFCFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(ICUNormFCD, options,NFCBuffer,NFCBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestICU_FCD_Orig_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(ICUNormFCD, options,lines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(ICUNormFCD, options,buffer,bufferLen, uselen);
return func;
}
}
// Test Win NFC Performance
UPerfFunction* NormalizerPerformanceTest::TestWin_NFC_NFD_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(WinNormNFC, options,NFDFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(WinNormNFC, options,NFDBuffer,NFDBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestWin_NFC_NFC_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(WinNormNFC, options,NFCFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(WinNormNFC, options,NFCBuffer,NFCBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestWin_NFC_Orig_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(WinNormNFC, options,lines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(WinNormNFC, options,buffer,bufferLen, uselen);
return func;
}
}
// Test Win NFD Performance
UPerfFunction* NormalizerPerformanceTest::TestWin_NFD_NFD_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(WinNormNFD, options,NFDFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(WinNormNFD, options,NFDBuffer,NFDBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestWin_NFD_NFC_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(WinNormNFD, options,NFCFileLines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(WinNormNFD, options,NFCBuffer,NFCBufferLen, uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestWin_NFD_Orig_Text(){
if(line_mode){
NormPerfFunction* func = new NormPerfFunction(WinNormNFD, options,lines,numLines, uselen);
return func;
}else{
NormPerfFunction* func = new NormPerfFunction(WinNormNFD, options,buffer,bufferLen, uselen);
return func;
}
}
// Test Quick Check Performance
UPerfFunction* NormalizerPerformanceTest::TestQC_NFC_NFD_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFDFileLines, numLines, UNORM_NFC, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFDBuffer, NFDBufferLen, UNORM_NFC, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestQC_NFC_NFC_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFCFileLines, numLines, UNORM_NFC, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFCBuffer, NFCBufferLen, UNORM_NFC, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestQC_NFC_Orig_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,lines, numLines, UNORM_NFC, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,buffer, bufferLen, UNORM_NFC, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestQC_NFD_NFD_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFDFileLines, numLines, UNORM_NFD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFDBuffer, NFDBufferLen, UNORM_NFD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestQC_NFD_NFC_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFCFileLines, numLines, UNORM_NFD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFCBuffer, NFCBufferLen, UNORM_NFD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestQC_NFD_Orig_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,lines, numLines, UNORM_NFD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,buffer, bufferLen, UNORM_NFD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestQC_FCD_NFD_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFDFileLines, numLines, UNORM_FCD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFDBuffer, NFDBufferLen, UNORM_FCD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestQC_FCD_NFC_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFCFileLines, numLines, UNORM_FCD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,NFCBuffer, NFCBufferLen, UNORM_FCD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestQC_FCD_Orig_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,lines, numLines, UNORM_FCD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUQuickCheck,buffer, bufferLen, UNORM_FCD, options,uselen);
return func;
}
}
// Test isNormalized Performance
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_NFC_NFD_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFDFileLines, numLines, UNORM_NFC, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFDBuffer, NFDBufferLen, UNORM_NFC, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_NFC_NFC_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFCFileLines, numLines, UNORM_NFC, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFCBuffer, NFCBufferLen, UNORM_NFC, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_NFC_Orig_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,lines, numLines, UNORM_NFC, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,buffer, bufferLen, UNORM_NFC, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_NFD_NFD_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFDFileLines, numLines, UNORM_NFD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFDBuffer, NFDBufferLen, UNORM_NFD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_NFD_NFC_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFCFileLines, numLines, UNORM_NFD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFCBuffer, NFCBufferLen, UNORM_NFD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_NFD_Orig_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,lines, numLines, UNORM_NFD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,buffer, bufferLen, UNORM_NFD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_FCD_NFD_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFDFileLines, numLines, UNORM_FCD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFDBuffer, NFDBufferLen, UNORM_FCD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_FCD_NFC_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFCFileLines, numLines, UNORM_FCD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,NFCBuffer, NFCBufferLen, UNORM_FCD, options,uselen);
return func;
}
}
UPerfFunction* NormalizerPerformanceTest::TestIsNormalized_FCD_Orig_Text(){
if(line_mode){
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,lines, numLines, UNORM_FCD, options,uselen);
return func;
}else{
QuickCheckPerfFunction* func = new QuickCheckPerfFunction(ICUIsNormalized,buffer, bufferLen, UNORM_FCD, options,uselen);
return func;
}
}
int main(int argc, const char* argv[]){
UErrorCode status = U_ZERO_ERROR;
NormalizerPerformanceTest test(argc, argv, status);
if(U_FAILURE(status)){
return status;
}
if(test.run()==FALSE){
fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n");
return -1;
}
return 0;
}