OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/perl |
| 2 # ******************************************************************** |
| 3 # * COPYRIGHT: |
| 4 # * Copyright (c) 2002-2008, International Business Machines Corporation and |
| 5 # * others. All Rights Reserved. |
| 6 # ******************************************************************** |
| 7 |
| 8 require "../perldriver/Common.pl"; |
| 9 |
| 10 use lib '../perldriver'; |
| 11 |
| 12 my $p; |
| 13 if ($OnWindows) { |
| 14 $p = $ICUPathLatest . "/collationperf/$WindowsPlatform/Release/collationperf
.exe"; |
| 15 } |
| 16 else { |
| 17 $p = $ICUPathLatest . "/collationperf/collperf"; |
| 18 } |
| 19 |
| 20 my @locale = ( |
| 21 "en_US", |
| 22 "da_DK", |
| 23 "de_DE", |
| 24 "fr_FR", |
| 25 "ja_JP", |
| 26 "ja_JP", |
| 27 "ja_JP", |
| 28 "ja_JP", |
| 29 "zh_CN", |
| 30 "zh_CN", |
| 31 "zh_CN", |
| 32 "zh_TW", |
| 33 "zh_TW", |
| 34 "ko_KR", |
| 35 "ko_KR", |
| 36 "ru_RU", |
| 37 "ru_RU", |
| 38 "th_TH", |
| 39 "th_TH" |
| 40 ); |
| 41 |
| 42 my $filePath = $CollationDataPath . "/"; |
| 43 my $filePrefix = "TestNames_"; |
| 44 my @data = ( |
| 45 $filePrefix."Latin.txt", |
| 46 $filePrefix."Latin.txt", |
| 47 $filePrefix."Latin.txt", |
| 48 $filePrefix."Latin.txt", |
| 49 $filePrefix."Latin.txt", |
| 50 $filePrefix."Japanese_h.txt", |
| 51 $filePrefix."Japanese_k.txt", |
| 52 $filePrefix."Asian.txt", |
| 53 $filePrefix."Latin.txt", |
| 54 $filePrefix."Chinese.txt", |
| 55 $filePrefix."Simplified_Chinese.txt", |
| 56 $filePrefix."Latin.txt", |
| 57 $filePrefix."Chinese.txt", |
| 58 $filePrefix."Latin.txt", |
| 59 $filePrefix."Korean.txt", |
| 60 $filePrefix."Latin.txt", |
| 61 $filePrefix."Russian.txt", |
| 62 $filePrefix."Latin.txt", |
| 63 $filePrefix."Thai.txt" |
| 64 ); |
| 65 |
| 66 my @resultPER; |
| 67 my @resultFIN; |
| 68 |
| 69 for ( $n = 0 ; $n < @data ; $n++ ) { |
| 70 my $resultICU; |
| 71 my $resultNIX; |
| 72 $resultICU = @locale[$n].",".@data[$n].","; |
| 73 $resultNIX = @locale[$n].",".@data[$n].","; |
| 74 @resultFIN[$n] = @locale[$n].",".@data[$n].","; |
| 75 |
| 76 #quicksort |
| 77 my @icu = `$p -locale @locale[$n] -loop 1000 -file $filePath@data[$n] -qsort
`; |
| 78 my @nix = `$p -locale @locale[$n] -unix -loop 1000 -file $filePath@data[$n]
-qsort`; |
| 79 |
| 80 my @icua = split( ' = ', $icu[2] ); |
| 81 my @icub = split( ' ', $icua[1] ); |
| 82 my @nixa = split( ' = ', $nix[2] ); |
| 83 my @nixb = split( ' ', $nixa[1] ); |
| 84 |
| 85 $resultICU = $resultICU.$icub[0].","; |
| 86 $resultNIX = $resultNIX.$nixb[0].","; |
| 87 |
| 88 #keygen time |
| 89 @icu = `$p -locale @locale[$n] -loop 1000 -file $filePath@data[$n] -keygen`; |
| 90 @nix = `$p -locale @locale[$n] -unix -loop 1000 -file $filePath@data[$n] -ke
ygen`; |
| 91 |
| 92 @icua = split( ' = ', $icu[2] ); |
| 93 @icub = split( ' ', $icua[1] ); |
| 94 @nixa = split( ' = ', $nix[2] ); |
| 95 @nixb = split( ' ', $nixa[1] ); |
| 96 |
| 97 $resultICU = $resultICU.$icub[0].","; |
| 98 $resultNIX = $resultNIX.$nixb[0].","; |
| 99 |
| 100 #keygen len |
| 101 @icua = split( ' = ', $icu[3] ); |
| 102 @nixa = split( ' = ', $nix[3] ); |
| 103 |
| 104 chomp( @icua[1] ); |
| 105 chomp( @nixa[1] ); |
| 106 |
| 107 $resultICU = $resultICU.$icua[1].","; |
| 108 $resultNIX = $resultNIX.$nixa[1].","; |
| 109 |
| 110 my @resultSplitICU; |
| 111 my @resultSplitNIX; |
| 112 |
| 113 #percent |
| 114 for ( $i = 0 ; $i < 3 ; $i++ ) { |
| 115 my $percent = 0; |
| 116 @resultSplitICU = split( ',', $resultICU ); |
| 117 @resultSplitNIX = split( ',', $resultNIX ); |
| 118 if ( @resultSplitICU[ 2 + $i ] > 0 ) { |
| 119 $percent = substr(((( |
| 120 @resultSplitNIX[ 2 + $i ] - @resultSplitICU[ 2 + $i ]) / @result
SplitICU[ 2 + $i ]) * 100), |
| 121 0, 7); |
| 122 } |
| 123 @resultPER[$n] = @resultPER[$n].$percent."%,"; |
| 124 } |
| 125 |
| 126 #store ICU result |
| 127 for ( $j = 0 ; $j < 3 ; $j++ ) { |
| 128 @resultFIN[$n] = @resultFIN[$n].@resultSplitICU[ 2 + $j ].","; |
| 129 } |
| 130 |
| 131 #store Unix result |
| 132 for ( $j = 0 ; $j < 3 ; $j++ ) { |
| 133 @resultFIN[$n] = @resultFIN[$n].@resultSplitNIX[ 2 + $j ].","; |
| 134 } |
| 135 |
| 136 #store Percent result |
| 137 @resultFIN[$n] = @resultFIN[$n].@resultPER[$n]; |
| 138 } |
| 139 |
| 140 # Print the results in a HTML page |
| 141 printOutput(); |
| 142 |
| 143 exit(0); |
| 144 |
| 145 # This subroutine creates the web page and prints out the results in a table |
| 146 sub printOutput { |
| 147 my $title = "Collation: ICU " . $ICULatestVersion . " vs GLIBC"; |
| 148 my $html = localtime; |
| 149 $html =~ s/://g; # ':' illegal |
| 150 $html =~ s/\s*\d+$//; # delete year |
| 151 $html =~ s/^\w+\s*//; # delete dow |
| 152 $html = "CollationPerformance $html.html"; |
| 153 $html = "../results/" . $html; |
| 154 $html =~ s/ /_/g; |
| 155 open( HTML, ">$html" ) or die "Can't write to $html: $!"; |
| 156 print HTML <<EOF; |
| 157 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" |
| 158 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| 159 <html xmlns="http://www.w3.org/1999/xhtml"> |
| 160 <head> |
| 161 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
| 162 <title>Collation: ICU4C vs. glibc</title> |
| 163 <link rel="stylesheet" href="../icu.css" type="text/css" /> |
| 164 </head> |
| 165 <body> |
| 166 <!--#include virtual="../ssi/header.html" --> |
| 167 EOF |
| 168 |
| 169 print HTML "<h2>Collation: ICU4C ".$ICULatestVersion." vs. GLIBC</h2>\n"; |
| 170 |
| 171 print HTML <<EOF; |
| 172 <p>The performance test takes a locale and creates a RuleBasedCollator with |
| 173 default options. A large list of names is used as data in each test, where the |
| 174 names vary according to language. Each Collation operation over the whole list |
| 175 is repeated 1000 times. The percentage values in the final column are the most |
| 176 useful. They measure differences, where positive is better for ICU4C, and |
| 177 negative is better for the compared implementation.</p> |
| 178 <h3>Key</h3> |
| 179 <table border="1" cellspacing="0" cellpadding="4"> |
| 180 <tr> |
| 181 <th align="left">Operation</th> |
| 182 <th align="left">Units</th> |
| 183 <th align="left">Description</th> |
| 184 </tr> |
| 185 <tr> |
| 186 <td>strcoll</td> |
| 187 <td>nanosecs</td> |
| 188 <td>Timing for string collation, an incremental compare of strings.</td> |
| 189 </tr> |
| 190 <tr> |
| 191 <td>keygen</td> |
| 192 <td>nanosecs</td> |
| 193 <td>Timing for generation of sort keys, used to 'precompile' information so |
| 194 that subsequent operations can use binary comparison.</td> |
| 195 </tr> |
| 196 <tr> |
| 197 <td>keylen</td> |
| 198 <td>bytes/char</td> |
| 199 <td>The average length of the generated sort keys, in bytes per character |
| 200 (Unicode/ISO 10646 code point). Generally this is the important field for sort |
| 201 key performance, since it directly impacts the time necessary for binary |
| 202 comparison, and the overhead of memory usage and retrieval time for sort |
| 203 keys.</td> |
| 204 </tr> |
| 205 </table> |
| 206 EOF |
| 207 printData(); |
| 208 |
| 209 print HTML <<EOF; |
| 210 <h3><i>Notes</i></h3> |
| 211 <ol> |
| 212 <li>As with all performance measurements, the results will vary according to |
| 213 the hardware and compiler. The strcoll operation is particularly sensitive; we |
| 214 have found that even slight changes in code alignment can produce 10% |
| 215 differences.</li> |
| 216 <li>For more information on incremental vs. sort key comparison, the importance |
| 217 of multi-level sorting, and other features of collation, see <a href= |
| 218 "http://www.unicode.org/reports/tr10/">Unicode Collation (UCA)</a>.</li> |
| 219 <li>For general information on ICU collation see <a href= |
| 220 "/userguide/Collate_Intro.html">User Guide</a>.</li> |
| 221 <li>For information on APIs, see <a href="/apiref/icu4c/ucol_8h.html">C</a>, |
| 222 <a href="/apiref/icu4c/classCollator.html">C++</a>, or <a href= |
| 223 "/apiref/icu4j/com/ibm/icu/text/Collator.html">Java</a>.</li> |
| 224 </ol> |
| 225 <!--#include virtual="../ssi/footer.html" --> |
| 226 </body> |
| 227 </html> |
| 228 |
| 229 EOF |
| 230 |
| 231 close(HTML) or die "Can't close $html: $!"; |
| 232 } |
| 233 |
| 234 # This subroutine formats and prints the table. |
| 235 sub printData() { |
| 236 print HTML <<EOF; |
| 237 <h3>Data</h3> |
| 238 <table border="1" cellspacing="0" cellpadding="4"> |
| 239 <tr> |
| 240 <td align="left"><b>Locale</b></td> |
| 241 <td align="left"><b>Data file</b></td> |
| 242 <td align="left"><b>strcoll</b> <i>(ICU)</i></td> |
| 243 <td align="left"><b>keygen</b> <i>(ICU)</i></td> |
| 244 <td align="left"><b>keylen</b> <i>(ICU)</i></td> |
| 245 <td align="left"><b>strcoll</b> <i>(GLIBC)</i></td> |
| 246 <td align="left"><b>keygen</b> <i>(GLIBC)</i></td> |
| 247 <td align="left"><b>keylen</b> <i>(GLIBC)</i></td> |
| 248 <td align="left"><b>strcoll</b> <i>(GLIBC-ICU)/ICU)</i></td> |
| 249 <td align="left"><b>keygen</b> <i>(GLIBC-ICU)/ICU)</i></td> |
| 250 <td align="left"><b>keylen</b> <i>(GLIBC-ICU)/ICU)</i></td> |
| 251 </tr> |
| 252 EOF |
| 253 |
| 254 for ( $n = 0 ; $n < @resultFIN ; $n++ ) { |
| 255 print HTML "<tr>"; |
| 256 my @parsed = split( ',', @resultFIN[$n] ); |
| 257 for ( $i = 0 ; $i < @parsed ; $i++ ) { |
| 258 my $value = @parsed[$i]; |
| 259 print HTML "<td align=\"center\">"; |
| 260 |
| 261 if ( $value =~ m/^[-]/ ) { |
| 262 print HTML "<font color=\"red\">$value</font>"; |
| 263 } |
| 264 else { |
| 265 print HTML "$value"; |
| 266 } |
| 267 |
| 268 print HTML "</td>"; |
| 269 |
| 270 } |
| 271 print HTML "</tr>\n"; |
| 272 } |
| 273 |
| 274 print HTML<<EOF; |
| 275 </table> |
| 276 EOF |
| 277 } |
OLD | NEW |