blob: ce18cf40ca99850a87852b44b3891edf17a3d873 [file] [log] [blame]
/**
*******************************************************************************
* Copyright (C) 1996-2001, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/text/UCD/CheckCollator.java,v $
* $Date: 2002/08/09 23:56:24 $
* $Revision: 1.2 $
*
*******************************************************************************
*/
// http://java.sun.com/j2se/1.3/docs/guide/intl/encoding.doc.html
package com.ibm.text.UCD;
import java.util.*;
import java.io.*;
import java.text.NumberFormat;
import com.ibm.text.utility.*;
import com.ibm.icu.text.UTF16;
import com.ibm.icu.text.UnicodeSet;
/**
* This is a quick and dirty program to get some idea of collation performance, comparing old Java to new stuff.
*/
abstract public class CheckCollator {
static final String PREFIX = "C:\\ICUInternal\\icu4c\\collation-perf-data\\TestNames_";
static final boolean DO_RAW = false;
static final NumberFormat nf = NumberFormat.getInstance();
static final NumberFormat percent = NumberFormat.getPercentInstance();
static {
nf.setMaximumFractionDigits(2);
}
public static void main(String[] args) throws IOException {
// later, drive off of args
// choices are: Asian, Chinese, Japanese, Japanese_h, Japanese_k, Korean, Latin, Russian, Thai
//test(Locale.KOREAN, "Korean");
test(Locale.ENGLISH, "Latin");
test(Locale.FRENCH, "Latin");
test(Locale.JAPANESE, "Japanese");
}
public static void test(Locale loc, String name) throws IOException {
System.out.println();
System.out.println("Testing " + loc.getDisplayName() + ", file: " + name);
System.out.println();
// get test data
String fileName = PREFIX + name + ".txt";
FileInputStream fis = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(fis, "UnicodeLittle");
BufferedReader br = new BufferedReader(isr, 32*1024);
int counter = 0;
ArrayList list = new ArrayList();
while (true) {
String line = Utility.readDataLine(br);
if (line == null) break;
if (line.length() == 0) continue;
Utility.dot(counter++);
list.add(line);
}
System.out.println("Read " + counter + " lines in file");
int limit = 800; // put a limit on it to save time
// pump it up if there aren't very many
while (list.size() < limit) {
list.addAll(list);
}
int size = list.size();
// later, adjust these so we always get a reasonble number of tries
int extraIterations = 200;
if (size > limit) size = limit;
String[] tests = new String [size];
for (int i = 0; i < size; ++i) {
tests[i] = (String) list.get(i);
}
// get collators
com.ibm.icu.text.Collator newCol = com.ibm.icu.text.Collator.getInstance(loc);
java.text.Collator oldCol = java.text.Collator.getInstance(loc);
double startTime, endTime;
double delta, oldDelta;
String probe;
// load classes at least once before starting
newCol.compare("a", "b");
oldCol.compare("a", "b");
// ================================================
// check sort key size
int stringSize = 0, newSize = 0, oldSize = 0;
for (int i = 0; i < size; ++i) {
stringSize += tests[i].length() * 2;
byte[] newKey = newCol.getCollationKey(tests[i]).toByteArray();
newSize += newKey.length;
byte[] oldKey = oldCol.getCollationKey(tests[i]).toByteArray();
oldSize += oldKey.length;
}
delta = stringSize/(size + 0.0);
System.out.println("string size: " + nf.format(delta) + " bytes per key");
System.out.println();
delta = oldDelta = (oldSize/(size + 0.0));
System.out.println("old sortkey size: " + nf.format(delta) + " bytes per key ");
delta = (newSize/(size + 0.0));
System.out.println("new sortkey size: " + nf.format(delta) + " bytes per key " + percent.format(delta/oldDelta));
System.out.println();
// ================================================
// Sort Key: old time
// get overhead time
counter = 0;
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
counter++;
}
}
endTime = System.currentTimeMillis();
double overhead = (1000*(endTime - startTime) / counter);
System.out.println("overhead: " + nf.format((endTime - startTime) / counter) + " micros");
counter = 0;
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
probe = tests[i];
for (int k = 0; k < extraIterations; ++k) {
oldCol.getCollationKey(probe);
counter++;
}
}
endTime = System.currentTimeMillis();
oldDelta = delta = (1000*(endTime - startTime) / counter) - overhead;
System.out.println("Old sort key time: " + nf.format(delta)
+ " micros (" + counter + " iterations)");
// Sort Key: new time
counter = 0;
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
probe = tests[i];
for (int k = 0; k < extraIterations; ++k) {
newCol.getCollationKey(probe);
counter++;
}
}
endTime = System.currentTimeMillis();
delta = (1000*(endTime - startTime) / counter) - overhead;
System.out.println("New sort key time: " + nf.format(delta)
+ " micros (" + counter + " iterations) " + percent.format(delta/oldDelta));
System.out.println();
// ================================================
// Raw Compare
if (DO_RAW) {
// get overhead time
counter = 0;
startTime = System.currentTimeMillis();
int opt = 0; // to keep the compiler from optimizing out
for (int i = 0; i < size; ++i) {
probe = tests[i];
for (int j = 0; j < size; ++j) {
opt ^= probe.compareTo(tests[j]);
counter++;
}
}
endTime = System.currentTimeMillis();
overhead = (1000*(endTime - startTime) / counter);
System.out.println("overhead: " + nf.format((endTime - startTime) / counter) + " micros");
// Raw Compare: old time
counter = 0;
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
probe = tests[i];
for (int j = 0; j < size; ++j) {
opt ^= oldCol.compare(probe, tests[j]);
counter++;
}
}
endTime = System.currentTimeMillis();
oldDelta = delta = (1000*(endTime - startTime) / counter) - overhead;
System.out.println("Old raw compare time: " + nf.format(delta)
+ " micros (" + counter + " iterations)");
// Raw Compare: new time
counter = 0;
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
probe = tests[i];
for (int j = 0; j < size; ++j) {
opt ^= newCol.compare(probe, tests[j]);
counter++;
}
}
endTime = System.currentTimeMillis();
delta = (1000*(endTime - startTime) / counter) - overhead;
System.out.println("New raw compare time: " + nf.format(delta)
+ " micros (" + counter + " iterations) " + percent.format(delta/oldDelta));
System.out.println();
}
// ================================================
// Binary Search
// note: I don't worry about getting the binary search precisely right, since I just want to
// see which strings would get compared.
// overhead
int iterations = (size * extraIterations);
startTime = System.currentTimeMillis();
Arrays.sort(tests);
int opt2 = 0; // keep from optimizing out
for (int i = 0; i < size; ++i) {
probe = tests[i];
for (int k = 0; k < extraIterations; ++k) {
opt2 ^= Arrays.binarySearch(tests, probe);
}
}
endTime = System.currentTimeMillis();
overhead = delta = (1000*(endTime - startTime) / iterations);
System.out.println("Overhead: " + nf.format(delta)
+ " micros (" + iterations + " iterations)");
// old time
startTime = System.currentTimeMillis();
Arrays.sort(tests, oldCol);
for (int i = 0; i < size; ++i) {
probe = tests[i];
for (int k = 0; k < extraIterations; ++k) {
opt2 ^= Arrays.binarySearch(tests, probe, oldCol);
}
}
endTime = System.currentTimeMillis();
oldDelta = delta = (1000*(endTime - startTime) / iterations) - overhead;
System.out.println("Old binary search time: " + nf.format(delta)
+ " micros (" + iterations + " iterations)");
// new time
Arrays.sort(tests, newCol);
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
probe = tests[i];
for (int k = 0; k < extraIterations; ++k) {
opt2 ^= Arrays.binarySearch(tests, probe, newCol);
}
}
endTime = System.currentTimeMillis();
delta = (1000*(endTime - startTime) / iterations) - overhead;
System.out.println("New binary search time: " + nf.format(delta)
+ " micros (" + iterations + " iterations) " + percent.format(delta/oldDelta));
System.out.println();
// ================================================
// Sort
String[] sortTests = (String[]) tests.clone();
extraIterations = 5;
iterations = (size * extraIterations);
// overhead
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
for (int k = 0; k < extraIterations; ++k) {
System.arraycopy(tests, 0, sortTests, 0, tests.length); // copy array
Arrays.sort(sortTests);
}
}
endTime = System.currentTimeMillis();
overhead = delta = (1000*(endTime - startTime) / iterations);
System.out.println("overhead: " + nf.format(delta)
+ " micros (" + iterations + " iterations)");
// old time
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
for (int k = 0; k < extraIterations; ++k) {
System.arraycopy(tests, 0, sortTests, 0, tests.length); // copy array
Arrays.sort(sortTests, oldCol);
}
}
endTime = System.currentTimeMillis();
oldDelta = delta = (1000*(endTime - startTime) / iterations) - overhead;
System.out.println("Old sort time: " + nf.format(delta)
+ " micros (" + iterations + " iterations)");
// new time
startTime = System.currentTimeMillis();
for (int i = 0; i < size; ++i) {
for (int k = 0; k < extraIterations; ++k) {
System.arraycopy(tests, 0, sortTests, 0, tests.length); // copy array
Arrays.sort(sortTests, newCol);
}
}
endTime = System.currentTimeMillis();
delta = (1000*(endTime - startTime) / iterations) - overhead;
System.out.println("New sort time: " + nf.format(delta)
+ " micros (" + iterations + " iterations) " + percent.format(delta/oldDelta));
}
}