Home | History | Annotate | Download | only in strsrchperf
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (C) 2008-2009 IBM, Inc.   All Rights Reserved.
      4  *
      5  ********************************************************************/
      6 /**
      7  * This program tests string search performance.
      8  * APIs tested:
      9  * ICU4C
     10  */
     11 
     12 #include "strsrchperf.h"
     13 
     14 StringSearchPerformanceTest::StringSearchPerformanceTest(int32_t argc, const char *argv[], UErrorCode &status)
     15 :UPerfTest(argc,argv,status){
     16     int32_t start, end;
     17 
     18 #ifdef TEST_BOYER_MOORE_SEARCH
     19     bms = NULL;
     20 #else
     21     srch = NULL;
     22 #endif
     23 
     24     pttrn = NULL;
     25     if(status== U_ILLEGAL_ARGUMENT_ERROR || line_mode){
     26        fprintf(stderr,gUsageString, "strsrchperf");
     27        return;
     28     }
     29     /* Get the Text */
     30     src = getBuffer(srcLen, status);
     31 
     32 #if 0
     33     /* Get a word to find. Do this by selecting a random word with a word breakiterator. */
     34     UBreakIterator* brk = ubrk_open(UBRK_WORD, locale, src, srcLen, &status);
     35     if(U_FAILURE(status)){
     36         fprintf(stderr, "FAILED to create pattern for searching. Error: %s\n", u_errorName(status));
     37         return;
     38     }
     39     start = ubrk_preceding(brk, 1000);
     40     end = ubrk_following(brk, start);
     41     pttrnLen = end - start;
     42     UChar* temp = (UChar*)malloc(sizeof(UChar)*(pttrnLen));
     43     for (int i = 0; i < pttrnLen; i++) {
     44         temp[i] = src[start++];
     45     }
     46     pttrn = temp; /* store word in pttrn */
     47     ubrk_close(brk);
     48 #else
     49     /* The first line of the file contains the pattern */
     50     start = 0;
     51 
     52     for(end = start; ; end += 1) {
     53         UChar ch = src[end];
     54 
     55         if (ch == 0x000A || ch == 0x000D || ch == 0x2028) {
     56             break;
     57         }
     58     }
     59 
     60     pttrnLen = end - start;
     61     UChar* temp = (UChar*)malloc(sizeof(UChar)*(pttrnLen));
     62     for (int i = 0; i < pttrnLen; i++) {
     63         temp[i] = src[start++];
     64     }
     65     pttrn = temp; /* store word in pttrn */
     66 #endif
     67 
     68 #ifdef TEST_BOYER_MOORE_SEARCH
     69     UnicodeString patternString(pttrn, pttrnLen);
     70     UCollator *coll = ucol_open(locale, &status);
     71     CollData *data = CollData::open(coll, status);
     72 
     73     targetString = new UnicodeString(src, srcLen);
     74     bms = new BoyerMooreSearch(data, patternString, targetString, status);
     75 #else
     76     /* Create the StringSearch object to be use in performance test. */
     77     srch = usearch_open(pttrn, pttrnLen, src, srcLen, locale, NULL, &status);
     78 #endif
     79 
     80     if(U_FAILURE(status)){
     81         fprintf(stderr, "FAILED to create UPerfTest object. Error: %s\n", u_errorName(status));
     82         return;
     83     }
     84 
     85 }
     86 
     87 StringSearchPerformanceTest::~StringSearchPerformanceTest() {
     88     CollData *data  = bms->getData();
     89     UCollator *coll = data->getCollator();
     90 
     91     delete bms;
     92     delete targetString;
     93     CollData::close(data);
     94     ucol_close(coll);
     95 
     96     if (pttrn != NULL) {
     97         free(pttrn);
     98     }
     99 
    100 #ifndef TEST_BOYER_MOORE_SEARCH
    101     if (srch != NULL) {
    102         usearch_close(srch);
    103     }
    104 #endif
    105 }
    106 
    107 UPerfFunction* StringSearchPerformanceTest::runIndexedTest(int32_t index, UBool exec, const char *&name, char *par) {
    108     switch (index) {
    109         TESTCASE(0,Test_ICU_Forward_Search);
    110         TESTCASE(1,Test_ICU_Backward_Search);
    111 
    112         default:
    113             name = "";
    114             return NULL;
    115     }
    116     return NULL;
    117 }
    118 
    119 UPerfFunction* StringSearchPerformanceTest::Test_ICU_Forward_Search(){
    120 #ifdef TEST_BOYER_MOORE_SEARCH
    121     StringSearchPerfFunction *func = new StringSearchPerfFunction(ICUForwardSearch, bms, src, srcLen, pttrn, pttrnLen);
    122 #else
    123     StringSearchPerfFunction* func = new StringSearchPerfFunction(ICUForwardSearch, srch, src, srcLen, pttrn, pttrnLen);
    124 #endif
    125     return func;
    126 }
    127 
    128 UPerfFunction* StringSearchPerformanceTest::Test_ICU_Backward_Search(){
    129 #ifdef TEST_BOYER_MOORE_SEARCH
    130     StringSearchPerfFunction *func = new StringSearchPerfFunction(ICUBackwardSearch, bms, src, srcLen, pttrn, pttrnLen);
    131 #else
    132     StringSearchPerfFunction* func = new StringSearchPerfFunction(ICUBackwardSearch, srch, src, srcLen, pttrn, pttrnLen);
    133 #endif
    134     return func;
    135 }
    136 
    137 int main (int argc, const char* argv[]) {
    138     UErrorCode status = U_ZERO_ERROR;
    139     StringSearchPerformanceTest test(argc, argv, status);
    140     if(U_FAILURE(status)){
    141         return status;
    142     }
    143     if(test.run()==FALSE){
    144         fprintf(stderr,"FAILED: Tests could not be run please check the arguments.\n");
    145         return -1;
    146     }
    147     return 0;
    148 }
    149