2 *******************************************************************************
\r
3 * Copyright (C) 2002-2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.perf;
\r
9 import java.io.ByteArrayInputStream;
\r
10 import java.io.ByteArrayOutputStream;
\r
11 import java.io.FileInputStream;
\r
12 import java.io.InputStreamReader;
\r
13 import java.io.OutputStreamWriter;
\r
14 import java.nio.ByteBuffer;
\r
15 import java.nio.CharBuffer;
\r
16 import java.nio.charset.Charset;
\r
17 import java.nio.charset.CharsetDecoder;
\r
18 import java.nio.charset.CharsetEncoder;
\r
19 import java.nio.charset.CodingErrorAction;
\r
21 import com.ibm.icu.charset.CharsetProviderICU;
\r
26 public class ConverterPerformanceTest extends PerfTest {
\r
27 public static void main(String[] args) throws Exception {
\r
28 new ConverterPerformanceTest().run(args);
\r
30 char[] unicodeBuffer = null;
\r
31 byte[] encBuffer = null;
\r
33 protected void setup(String[] args) {
\r
35 // read in the input file, being careful with a possible BOM
\r
36 FileInputStream in = new FileInputStream(fileName);
\r
37 BOMFreeReader reader = new BOMFreeReader(in, encoding);
\r
38 unicodeBuffer = readToEOS(reader);
\r
40 // use java.nio to convert unicodeBuffer from char[] to byte[]
\r
41 CharBuffer source = CharBuffer.wrap(unicodeBuffer, 0, unicodeBuffer.length);
\r
42 CharsetEncoder encoder = Charset.forName(encoding).newEncoder();
\r
43 encoder.onMalformedInput(CodingErrorAction.REPORT);
\r
44 encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
\r
45 ByteBuffer target = encoder.encode(source);
\r
47 // target.array() will probably return what we want, but lets take no chances
\r
48 encBuffer = new byte[target.limit()];
\r
49 for (int i=0; i<encBuffer.length; i++)
\r
50 encBuffer[i] = target.get(i);
\r
52 } catch(Exception ex){
\r
53 ex.printStackTrace();
\r
54 throw new RuntimeException(ex.getMessage());
\r
57 // we created some heavy objects, so lets try to clean up a little before running the tests
\r
61 PerfTest.Function TestFromUnicodeStream() {
\r
62 return new PerfTest.Function() {
\r
63 public void call() {
\r
65 ByteArrayOutputStream out = new ByteArrayOutputStream(unicodeBuffer.length * 10);
\r
66 OutputStreamWriter writer = new OutputStreamWriter(out, testName);
\r
67 writer.write(unicodeBuffer, 0, unicodeBuffer.length);
\r
69 }catch(Exception e){
\r
70 e.printStackTrace();
\r
71 throw new RuntimeException(e.getMessage());
\r
74 public long getOperationsPerIteration() {
\r
75 return unicodeBuffer.length;
\r
79 PerfTest.Function TestToUnicodeStream() {
\r
80 return new PerfTest.Function() {
\r
81 char[] dst = new char[encBuffer.length];
\r
82 public void call() {
\r
84 ByteArrayInputStream is = new ByteArrayInputStream(encBuffer, 0, encBuffer.length);
\r
85 InputStreamReader reader = new InputStreamReader(is, testName);
\r
86 reader.read(dst, 0, dst.length);
\r
88 }catch(Exception e){
\r
89 e.printStackTrace();
\r
90 throw new RuntimeException(e.getMessage());
\r
93 public long getOperationsPerIteration() {
\r
94 return encBuffer.length;
\r
99 PerfTest.Function TestByteToCharConverter() { // decoder charset.forname().newencoder().decode
\r
101 return new PerfTest.Function() {
\r
102 char[] dst = new char[encBuffer.length];
\r
104 ByteToCharConverter conv = ByteToCharConverter.getConverter(testEncoderName);
\r
106 public void call() {
\r
108 numOut= conv.convert(encBuffer, 0, encBuffer.length, dst, 0,dst.length);
\r
110 }catch(Exception e){
\r
111 e.printStackTrace();
\r
112 throw new RuntimeException(e.getMessage());
\r
115 public long getOperationsPerIteration() {
\r
116 return encBuffer.length;
\r
119 }catch(Exception e){
\r
120 e.printStackTrace();
\r
121 throw new RuntimeException(e.getMessage());
\r
125 PerfTest.Function TestCharToByteConverter() { // encoder charset.forname().newencoder().encode
\r
127 return new PerfTest.Function() {
\r
128 byte[] dst = new byte[encBuffer.length];
\r
130 CharToByteConverter conv = CharToByteConverter.getConverter(testEncoderName);
\r
132 public void call() {
\r
134 numOut= conv.convert(unicodeBuffer, 0,unicodeBuffer.length,dst,0, dst.length);
\r
136 }catch(Exception e){
\r
137 e.printStackTrace();
\r
138 throw new RuntimeException(e.getMessage());
\r
141 public long getOperationsPerIteration() {
\r
142 return unicodeBuffer.length;
\r
145 }catch(Exception e){
\r
146 e.printStackTrace();
\r
147 throw new RuntimeException(e.getMessage());
\r
151 PerfTest.Function TestByteToCharConverterICU() { // decoder charsetprovidericu.getdecoder
\r
153 return new PerfTest.Function() {
\r
154 char[] dst = new char[encBuffer.length];
\r
156 ByteToCharConverter conv = ByteToCharConverterICU.createConverter(testEncoderName);
\r
158 public void call() {
\r
160 numOut= conv.convert(encBuffer, 0, encBuffer.length, dst, 0,dst.length);
\r
162 }catch(Exception e){
\r
163 e.printStackTrace();
\r
164 throw new RuntimeException(e.getMessage());
\r
167 public long getOperationsPerIteration() {
\r
168 return encBuffer.length;
\r
171 }catch(Exception e){
\r
172 e.printStackTrace();
\r
173 throw new RuntimeException(e.getMessage());
\r
177 PerfTest.Function TestCharToByteConverterICU() {
\r
179 return new PerfTest.Function() {
\r
180 byte[] dst = new byte[encBuffer.length*2];
\r
182 CharToByteConverter conv = CharToByteConverterICU.createConverter(testEncoderName);
\r
184 public void call() {
\r
186 numOut= conv.convert(unicodeBuffer, 0,unicodeBuffer.length,dst,0, dst.length);
\r
188 }catch(Exception e){
\r
189 e.printStackTrace();
\r
190 throw new RuntimeException(e.getMessage());
\r
193 public long getOperationsPerIteration() {
\r
194 return unicodeBuffer.length;
\r
197 }catch(Exception e){
\r
198 e.printStackTrace();
\r
199 throw new RuntimeException(e.getMessage());
\r
203 PerfTest.Function TestCharsetDecoder() {
\r
205 return new PerfTest.Function() {
\r
206 CharBuffer outBuf = CharBuffer.allocate(unicodeBuffer.length);
\r
207 Charset myCharset = Charset.forName(testName);
\r
208 ByteBuffer srcBuf = ByteBuffer.wrap(encBuffer,0,encBuffer.length);
\r
209 CharsetDecoder decoder = myCharset.newDecoder();
\r
211 public void call() {
\r
213 decoder.decode(srcBuf,outBuf,false);
\r
217 }catch(Exception e){
\r
218 e.printStackTrace();
\r
219 throw new RuntimeException(e.getMessage());
\r
222 public long getOperationsPerIteration() {
\r
223 return encBuffer.length;
\r
226 }catch(Exception e){
\r
227 e.printStackTrace();
\r
228 throw new RuntimeException(e.getMessage());
\r
232 PerfTest.Function TestCharsetEncoder() {
\r
234 return new PerfTest.Function() {
\r
235 ByteBuffer outBuf = ByteBuffer.allocate(encBuffer.length);
\r
236 Charset myCharset = Charset.forName(testName);
\r
237 CharBuffer srcBuf = CharBuffer.wrap(unicodeBuffer,0,unicodeBuffer.length);
\r
238 CharsetEncoder encoder = myCharset.newEncoder();
\r
240 public void call() {
\r
242 encoder.encode(srcBuf,outBuf,false);
\r
246 }catch(Exception e){
\r
247 e.printStackTrace();
\r
248 throw new RuntimeException(e.getMessage());
\r
251 public long getOperationsPerIteration() {
\r
252 return unicodeBuffer.length;
\r
255 }catch(Exception e){
\r
256 e.printStackTrace();
\r
257 throw new RuntimeException(e.getMessage());
\r
261 PerfTest.Function TestCharsetDecoderICU() {
\r
263 return new PerfTest.Function() {
\r
264 CharBuffer outBuf = CharBuffer.allocate(unicodeBuffer.length);
\r
265 Charset myCharset = new CharsetProviderICU().charsetForName(testName);
\r
266 ByteBuffer srcBuf = ByteBuffer.wrap(encBuffer,0,encBuffer.length);
\r
267 CharsetDecoder decoder = myCharset.newDecoder();
\r
269 public void call() {
\r
271 decoder.decode(srcBuf,outBuf,false);
\r
275 }catch(Exception e){
\r
276 e.printStackTrace();
\r
277 throw new RuntimeException(e.getMessage());
\r
280 public long getOperationsPerIteration() {
\r
281 return encBuffer.length;
\r
284 }catch(Exception e){
\r
285 e.printStackTrace();
\r
286 throw new RuntimeException(e.getMessage());
\r
290 PerfTest.Function TestCharsetEncoderICU() {
\r
292 return new PerfTest.Function() {
\r
293 ByteBuffer outBuf = ByteBuffer.allocate(encBuffer.length);
\r
294 Charset myCharset = new CharsetProviderICU().charsetForName(testName);
\r
295 CharBuffer srcBuf = CharBuffer.wrap(unicodeBuffer,0,unicodeBuffer.length);
\r
296 CharsetEncoder encoder = myCharset.newEncoder();
\r
298 public void call() {
\r
300 encoder.encode(srcBuf,outBuf,false);
\r
304 }catch(Exception e){
\r
305 e.printStackTrace();
\r
306 throw new RuntimeException(e.getMessage());
\r
309 public long getOperationsPerIteration() {
\r
310 return unicodeBuffer.length;
\r
313 }catch(Exception e){
\r
314 e.printStackTrace();
\r
315 throw new RuntimeException(e.getMessage());
\r