/******************************************************************** * COPYRIGHT: * Copyright (C) 2008-2009 IBM, Inc. All Rights Reserved. * ********************************************************************/ /** * This program tests string search performance. * APIs tested: * ICU4C */ #include "strsrchperf.h" StringSearchPerformanceTest::StringSearchPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status) :UPerfTest(argc,argv,status){ int32_t start, end; #ifdef TEST_BOYER_MOORE_SEARCH bms = NULL; #else srch = NULL; #endif pttrn = NULL; if(status== U_ILLEGAL_ARGUMENT_ERROR || line_mode){ fprintf(stderr,gUsageString, "strsrchperf"); return; } /* Get the Text */ src = getBuffer(srcLen, status); #if 0 /* Get a word to find. Do this by selecting a random word with a word breakiterator. */ UBreakIterator* brk = ubrk_open(UBRK_WORD, locale, src, srcLen, &status); if(U_FAILURE(status)){ fprintf(stderr, "FAILED to create pattern for searching. Error: %s\n", u_errorName(status)); return; } start = ubrk_preceding(brk, 1000); end = ubrk_following(brk, start); pttrnLen = end - start; UChar* temp = (UChar*)malloc(sizeof(UChar)*(pttrnLen)); for (int i = 0; i < pttrnLen; i++) { temp[i] = src[start++]; } pttrn = temp; /* store word in pttrn */ ubrk_close(brk); #else /* The first line of the file contains the pattern */ start = 0; for(end = start; ; end += 1) { UChar ch = src[end]; if (ch == 0x000A || ch == 0x000D || ch == 0x2028) { break; } } pttrnLen = end - start; UChar* temp = (UChar*)malloc(sizeof(UChar)*(pttrnLen)); for (int i = 0; i < pttrnLen; i++) { temp[i] = src[start++]; } pttrn = temp; /* store word in pttrn */ #endif #ifdef TEST_BOYER_MOORE_SEARCH UnicodeString patternString(pttrn, pttrnLen); UCollator *coll = ucol_open(locale, &status); CollData *data = CollData::open(coll, status); targetString = new UnicodeString(src, srcLen); bms = new BoyerMooreSearch(data, patternString, targetString, status); #else /* Create the StringSearch object to be use in performance test. */ srch = usearch_open(pttrn, pttrnLen, src, srcLen, locale, NULL, &status); #endif if(U_FAILURE(status)){ fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", u_errorName(status)); return; } } StringSearchPerformanceTest::~StringSearchPerformanceTest() { CollData *data = bms->getData(); UCollator *coll = data->getCollator(); delete bms; delete targetString; CollData::close(data); ucol_close(coll); if (pttrn != NULL) { free(pttrn); } #ifndef TEST_BOYER_MOORE_SEARCH if (srch != NULL) { usearch_close(srch); } #endif } UPerfFunction* StringSearchPerformanceTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *par) { switch (index) { TESTCASE(0,Test_ICU_Forward_Search); TESTCASE(1,Test_ICU_Backward_Search); default: name = ""; return NULL; } return NULL; } UPerfFunction* StringSearchPerformanceTest::Test_ICU_Forward_Search(){ #ifdef TEST_BOYER_MOORE_SEARCH StringSearchPerfFunction *func = new StringSearchPerfFunction(ICUForwardSearch, bms, src, srcLen, pttrn, pttrnLen); #else StringSearchPerfFunction* func = new StringSearchPerfFunction(ICUForwardSearch, srch, src, srcLen, pttrn, pttrnLen); #endif return func; } UPerfFunction* StringSearchPerformanceTest::Test_ICU_Backward_Search(){ #ifdef TEST_BOYER_MOORE_SEARCH StringSearchPerfFunction *func = new StringSearchPerfFunction(ICUBackwardSearch, bms, src, srcLen, pttrn, pttrnLen); #else StringSearchPerfFunction* func = new StringSearchPerfFunction(ICUBackwardSearch, srch, src, srcLen, pttrn, pttrnLen); #endif return func; } int main (int argc, const char* argv[]) { UErrorCode status = U_ZERO_ERROR; StringSearchPerformanceTest 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; }