Link to code: AutocompletorBenchmark.java
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import java.util.Random;
import java.util.Scanner;
import javax.swing.JFileChooser;
public class AutocompletorBenchmark {
public static Random ourRandom = new Random(1234);
public static final String CHARSET = "UTF-8";
public static final Locale LOCALE = Locale.US;
public static Autocompletor getInstance(String[] words, double[] weights) {
return new BruteAutocomplete(words, weights);
}
// chooser allows users to select a file by navigating through
// directories
private static JFileChooser ourChooser = new JFileChooser(System
.getProperties().getProperty("user.dir"));
/**
* Brings up chooser for user to select a file
*
* @return Scanner for user selected file, null if file not found
*/
public static Scanner getScanner() {
int retval = ourChooser.showOpenDialog(null);
if (retval == JFileChooser.APPROVE_OPTION) {
File f = ourChooser.getSelectedFile();
Scanner s;
try {
if (f.canRead()) {
System.out.println("Opening - " + f.getCanonicalPath() + ".");
} else {
System.out.println("Could not open selected file.");
return null;
}
s = new Scanner(f, CHARSET);
s.useLocale(LOCALE);
} catch (IOException e) {
return null;
}
return s;
}
return null;
}
public static long countNodes(Node root) {
long result = 1;
for (Node child : root.children.values())
result += countNodes(child);
return result;
}
public static void main(String[] args) {
Scanner in = null;
do {
in = getScanner();
} while (in == null);
int N = 0;
String[] terms = null;
double[] weights = null;
try {
N = Integer.parseInt(in.nextLine());
terms = new String[N];
weights = new double[N];
for (int i = 0; i < N; i++) {
String line = in.nextLine();
int tab = line.indexOf('\t');
weights[i] = Double.parseDouble(line.substring(0, tab).trim());
terms[i] = line.substring(tab + 1).toLowerCase();
}
} catch (Exception e) { //could be any parsing related exception
System.err.println("File is malformatted");
System.exit(0);
}
long startTime = System.nanoTime();
Autocompletor auto = getInstance(terms, weights);
System.out.println("Benchmarking " + auto.getClass().getName() + "...");
System.out.println("Found " + N + " words");
System.out.println("Time to initialize - " + (System.nanoTime() - startTime) / 1E9);
if (auto instanceof TrieAutocomplete)
System.out.println("Created " + countNodes(((TrieAutocomplete) auto).myRoot) + " nodes");
String randomWord = "";
while (randomWord.length() <= 2)
randomWord = terms[ourRandom.nextInt(terms.length)];
String randomPrefix1 = randomWord.substring(0, 1);
String randomPrefix2 = randomWord.substring(0, 2);
String[] queries = { "", randomWord, randomPrefix1, randomPrefix2, "notarealword" };
int trial;
for (String query : queries) {
startTime = System.nanoTime();
for (trial = 0; trial < 1000; trial++) {
auto.topMatch(query);
if (System.nanoTime() - startTime > 5E9)
break;
}
System.out.println(
"Time for topMatch(\"" + query + "\") - " + (System.nanoTime() - startTime) / (1E9 * trial));
}
for (String query : queries) {
for (int k = 1; k <= 7; k += 3) {
startTime = System.nanoTime();
for (trial = 0; trial < 1000; trial++) {
auto.topKMatches(query, 3);
if (System.nanoTime() - startTime > 5E9)
break;
}
System.out.println("Time for topKMatches(\"" + query + "\", " + k + ")" + " - " + " "
+ (System.nanoTime() - startTime) / (1E9 * trial));
}
}
}
}