]>
Commit | Line | Data |
---|---|---|
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 | } |