ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/MapWordLoops.java
Revision: 1.1
Committed: Mon May 2 19:19:38 2005 UTC (19 years ago) by dl
Branch: MAIN
Log Message:
Put misc performance tests into CVS

File Contents

# User Rev Content
1 dl 1.1 import java.util.*;
2     import java.io.*;
3    
4     public class MapWordLoops {
5    
6     static final String[] WORDS_FILES = {
7     "kw.txt",
8     "class.txt",
9     "dir.txt",
10     "ids.txt",
11     "/usr/dict/words",
12     };
13    
14     static final int MAX_WORDS = 500000;
15     static final int pinsert = 60;
16     static final int premove = 1;
17     static final int NOPS = 5000000;
18     static final int numTests = 3;
19    
20     public static void main(String[] args) {
21     Class mapClass = null;
22     try {
23     mapClass = Class.forName(args[0]);
24     } catch(ClassNotFoundException e) {
25     throw new RuntimeException("Class " + args[0] + " not found.");
26     }
27    
28     System.out.println("Testing " + mapClass.getName());
29    
30     for (int s = 0; s < WORDS_FILES.length; ++s)
31     tests(mapClass, numTests, s);
32    
33     for (int s = WORDS_FILES.length-1; s >= 0; --s)
34     tests(mapClass, numTests, s);
35    
36     }
37    
38     static void tests(Class mapClass, int numTests, int sizeIndex) {
39     try {
40     String[] key = readWords(sizeIndex);
41     int size = key.length;
42    
43     System.out.print("n = " +LoopHelpers.rightJustify(size) +" : ");
44     long least = Long.MAX_VALUE;
45    
46     for (int i = 0; i < numTests; ++i) {
47     Map<String,String> m = newMap(mapClass);
48     long t = doTest(mapClass.getName(), m, key);
49     if (t < least) least = t;
50     m.clear();
51     m = null;
52     }
53    
54     long nano = Math.round(1000000.0 * (least) / NOPS);
55     System.out.println(LoopHelpers.rightJustify(nano) + " ns per op");
56     } catch (IOException ignore) {
57     return; // skip test if can't read file
58     }
59     }
60    
61    
62     static Map<String,String> newMap(Class cl) {
63     try {
64     Map m = (Map<String,String>)cl.newInstance();
65     return m;
66     } catch(Exception e) {
67     throw new RuntimeException("Can't instantiate " + cl + ": " + e);
68     }
69     }
70    
71     static void pause() {
72     try { Thread.sleep(100); } catch(InterruptedException ie) { return; }
73     }
74    
75     static String[] readWords(int sizeIndex) throws IOException {
76     String[] l = new String[MAX_WORDS];
77     String[] array = null;
78     try {
79     FileReader fr = new FileReader(WORDS_FILES[sizeIndex]);
80     BufferedReader reader = new BufferedReader(fr);
81     int k = 0;
82     for (;;) {
83     String s = reader.readLine();
84     if (s == null) break;
85     l[k++] = s;
86     }
87     array = new String[k];
88     for (int i = 0; i < k; ++i) {
89     array[i] = l[i];
90     l[i] = null;
91     }
92     l = null;
93     reader.close();
94     }
95     catch (IOException ex) {
96     System.out.println("Can't read words file:" + ex);
97     throw ex;
98     }
99     return array;
100     }
101    
102     static long doTest(String name,
103     final Map<String,String> m,
104     final String[] key) {
105    
106     // System.out.print(name + "\t");
107     Runner runner = new Runner(m, key);
108     long startTime = System.currentTimeMillis();
109     runner.run();
110     long afterRun = System.currentTimeMillis();
111     long runTime = (afterRun - startTime);
112     int np = runner.total;
113     if (runner.total == runner.hashCode())
114     System.out.println("Useless Number" + runner.total);
115     int sz = runner.maxsz;
116     if (sz == runner.hashCode())
117     System.out.println("Useless Number" + sz);
118     // System.out.print(" m = " + sz);
119     return runTime;
120     }
121    
122    
123     static class Runner implements Runnable {
124     final Map<String,String> map;
125     final String[] key;
126     LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
127     final int pctrem;
128     final int pctins;
129     int nputs = 0;
130     int npgets = 0;
131     int nagets = 0;
132     int nremoves = 0;
133     volatile int total;
134     int maxsz;
135    
136     Runner(Map<String,String> m, String[] k) {
137     map = m; key = k;
138     pctrem = (int)(((long)premove * (long)(Integer.MAX_VALUE/2)) / 50);
139     pctins = (int)(((long)pinsert * (long)(Integer.MAX_VALUE/2)) / 50);
140     }
141    
142    
143     int oneStep(int j) {
144     int n = key.length;
145     int r = rng.next() & 0x7FFFFFFF;
146     int jinc = (r & 7);
147     j += jinc - 3;
148     if (j >= n) j -= n;
149     if (j < 0) j += n;
150    
151     int l = n / 4 + j;
152     if (l >= n) l -= n;
153    
154     String k = key[j];
155     String x = map.get(k);
156    
157     if (x == null) {
158     ++nagets;
159     if (r < pctins) {
160     map.put(k, key[l]);
161     ++nputs;
162     int csz = nputs - nremoves;
163     if (csz > maxsz) maxsz = csz;
164     }
165     }
166     else {
167     if (k== x) ++npgets;
168     if (r < pctrem) {
169     map.remove(k);
170     ++nremoves;
171     j += ((r >>> 8) & 7) + n / 2;
172     if (j >= n) j -= n;
173     }
174     }
175     return j;
176     }
177    
178     public void run() {
179     int j = key.length / 2;
180     for (int i = 0; i < NOPS; ++i) {
181     j = oneStep(j);
182     }
183     total = nputs + npgets + nagets + nremoves;
184     }
185     }
186    
187     }