如何高效的实现一个计数器map(二)
] strs = "abcdefghijklmnopqrstuvwxyz".split("");
57:
58: void pre() {
59: System.out.println("====" + this.getName() + "Test Case ");
60: ms = System.currentTimeMillis();
61: System.out.println("start at " + ms);
62: }
63:
64: void post() {
65: ms = System.currentTimeMillis() - ms;
66: System.out.println("Time used: " + ms + " ms");
67: }
68:
69: abstract void doAction(int cycles);
70:
71: public void test(int cycles) {
72: pre();
73: doAction(cycles);
74: post();
75: }
76:
77: abstract String getName();
78: }
79:
80: class BaseLine extends Tester {
81: final Map freq = new HashMap();
82:
83: @Override
84: void doAction(int cycles) {
85: for (int i = 0; i < cycles; i++) {
86: for (String word : strs) {
87: int count = freq.containsKey(word) freq.get(word) : 0;
88: freq.put(word, count + 1);
89: }
90: }
91: }
92:
93: @Override
94: String getName() {
95: return "BaseLine";
96: }
97:
98: }
99:
100: class UseNullTest extends Tester {
101: final Map freq = new HashMap();
102:
103: @Override
104: void doAction(int cycles) {
105: for (int i = 0; i < cycles; i++) {
106: for (String word : strs) {
107: Integer count = freq.get(word);
108: if (count == null) {
109: freq.put(word, 1);
110: } else {
111: freq.put(word, count + 1);
112: }
113: }
114: }
115: }
116:
117: @Override
118: String getName() {
119: return "TestForNull";
120: }
121:
122: }
123:
124: class UseAtomicLong extends Tester {
125: final ConcurrentMap map = new ConcurrentHashMap();
126:
127: @Override
128: void doAction(int cycles) {
129: for (int i = 0; i < cycles; i++) {
130: for (String word : strs) {
131: map.putIfAbsent(word, new AtomicLong(0));
132: map.get(word).incrementAndGet();
133: }
134: }
135: }
136:
137: @Override
138: String getName() {
139: return "AtomicLong";
140: }
141:
142: }
143:
144: class UseTrove extends Tester {
145: final TObjectIntHashMap freq = new TObjectIntHashMap();
146:
147: @Override
148: void doAction(int cycles) {
149: for (int i = 0; i < cycles; i++) {
150: for (String word : strs) {
151: freq.adjustOrPutValue(word, 1, 1);
152: }
153: }
154: }
155:
156: @Override
157: String getName() {
158: return "Trove";
159: }
160:
161: }
162:
163: class MutableInt {
164: int value = 1; // note that we start at 1 since we're counting
165:
166: public void increment() {
167: ++value;
168: }
169:
170: public int get() {
171: return value;
172: }
173: }
174:
175: class UseMutableInt extends Tester {
176: Map freq = new HashMap();
177:
178: @Override
179: void doAction(int cycles) {
180: for (int i = 0; i < cycles; i++) {
181: for (String word : strs) {
182: MutableInt count = freq.get(word);
183: if (count == null) {
184: f