ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/MapWordLoops.java
Revision: 1.2
Committed: Mon May 9 19:33:30 2005 UTC (19 years ago) by dl
Branch: MAIN
Changes since 1.1: +5 -0 lines
Log Message:
Add headers

File Contents

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