Skip to content

Commit 3c27dbf

Browse files
committed
Unit string to numeric ID benchmark
1 parent 995ecfc commit 3c27dbf

File tree

1 file changed

+260
-0
lines changed

1 file changed

+260
-0
lines changed
Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
/*
2+
3+
Copyright (c) 2024, Carlos Amengual.
4+
5+
Licensed under a BSD-style License. You can find the license here:
6+
https://css4j.github.io/LICENSE.txt
7+
8+
*/
9+
/*
10+
* SPDX-License-Identifier: BSD-3-Clause
11+
*/
12+
13+
package io.sf.carte.mark;
14+
15+
import java.util.HashMap;
16+
17+
import org.openjdk.jmh.annotations.Benchmark;
18+
import org.openjdk.jmh.annotations.Fork;
19+
20+
import io.sf.carte.doc.style.css.CSSUnit;
21+
22+
/**
23+
* Compare ways to convert a unit string to a numeric ID.
24+
*/
25+
@Fork(value = 2, warmups = 2)
26+
public class UnitStringToNumberMark {
27+
28+
private static HashMap<String, Short> unitMap = createUnitMap();
29+
30+
private static HashMap<String, Short> createUnitMap() {
31+
HashMap<String, Short> unitMap = new HashMap<>(37);
32+
unitMap.put("%", CSSUnit.CSS_PERCENTAGE);
33+
unitMap.put("em", CSSUnit.CSS_EM);
34+
unitMap.put("ex", CSSUnit.CSS_EX);
35+
unitMap.put("cap", CSSUnit.CSS_CAP);
36+
unitMap.put("ch", CSSUnit.CSS_CH);
37+
unitMap.put("lh", CSSUnit.CSS_LH);
38+
unitMap.put("ic", CSSUnit.CSS_IC);
39+
unitMap.put("rem", CSSUnit.CSS_REM);
40+
unitMap.put("rex", CSSUnit.CSS_REX);
41+
unitMap.put("rch", CSSUnit.CSS_RCH);
42+
unitMap.put("ric", CSSUnit.CSS_RIC);
43+
unitMap.put("rlh", CSSUnit.CSS_RLH);
44+
unitMap.put("vw", CSSUnit.CSS_VW);
45+
unitMap.put("vh", CSSUnit.CSS_VH);
46+
unitMap.put("vi", CSSUnit.CSS_VI);
47+
unitMap.put("vb", CSSUnit.CSS_VB);
48+
unitMap.put("vmin", CSSUnit.CSS_VMIN);
49+
unitMap.put("vmax", CSSUnit.CSS_VMAX);
50+
unitMap.put("cm", CSSUnit.CSS_CM);
51+
unitMap.put("mm", CSSUnit.CSS_MM);
52+
unitMap.put("q", CSSUnit.CSS_QUARTER_MM);
53+
unitMap.put("in", CSSUnit.CSS_IN);
54+
unitMap.put("pt", CSSUnit.CSS_PT);
55+
unitMap.put("pc", CSSUnit.CSS_PC);
56+
unitMap.put("px", CSSUnit.CSS_PX);
57+
unitMap.put("deg", CSSUnit.CSS_DEG);
58+
unitMap.put("grad", CSSUnit.CSS_GRAD);
59+
unitMap.put("rad", CSSUnit.CSS_RAD);
60+
unitMap.put("turn", CSSUnit.CSS_TURN);
61+
unitMap.put("s", CSSUnit.CSS_S);
62+
unitMap.put("ms", CSSUnit.CSS_MS);
63+
unitMap.put("hz", CSSUnit.CSS_HZ);
64+
unitMap.put("khz", CSSUnit.CSS_KHZ);
65+
unitMap.put("dpi", CSSUnit.CSS_DPI);
66+
unitMap.put("dpcm", CSSUnit.CSS_DPCM);
67+
unitMap.put("dppx", CSSUnit.CSS_DPPX);
68+
unitMap.put("fr", CSSUnit.CSS_FR);
69+
return unitMap;
70+
}
71+
72+
@Benchmark
73+
public void markHashMap() {
74+
int unit = unitFromStringHashMap("%");
75+
unit += unitFromStringHashMap("em");
76+
unit += unitFromStringHashMap("ex");
77+
unit += unitFromStringHashMap("rem");
78+
unit += unitFromStringHashMap("rex");
79+
unit += unitFromStringHashMap("in");
80+
unit += unitFromStringHashMap("pt");
81+
unit += unitFromStringHashMap("pc");
82+
unit += unitFromStringHashMap("px");
83+
unit += unitFromStringHashMap("deg");
84+
unit += unitFromStringHashMap("turn");
85+
unit += unitFromStringHashMap("ooo");
86+
unit += unitFromStringHashMap("s");
87+
unit += unitFromStringHashMap("ms");
88+
89+
// px and pt are very frequent
90+
for (int i = 0; i < 200; i++) {
91+
unit += unitFromStringHashMap("px");
92+
unit += unitFromStringHashMap("pt");
93+
}
94+
95+
assert (unit > 2200);
96+
}
97+
98+
@Benchmark
99+
public void markHashMapDefault() {
100+
int unit = unitFromStringHashMapDefault("%");
101+
unit += unitFromStringHashMapDefault("em");
102+
unit += unitFromStringHashMapDefault("ex");
103+
unit += unitFromStringHashMapDefault("rem");
104+
unit += unitFromStringHashMapDefault("rex");
105+
unit += unitFromStringHashMapDefault("in");
106+
unit += unitFromStringHashMapDefault("pt");
107+
unit += unitFromStringHashMapDefault("pc");
108+
unit += unitFromStringHashMapDefault("px");
109+
unit += unitFromStringHashMapDefault("deg");
110+
unit += unitFromStringHashMapDefault("turn");
111+
unit += unitFromStringHashMapDefault("ooo");
112+
unit += unitFromStringHashMapDefault("s");
113+
unit += unitFromStringHashMapDefault("ms");
114+
115+
// px and pt are very frequent
116+
for (int i = 0; i < 200; i++) {
117+
unit += unitFromStringHashMapDefault("px");
118+
unit += unitFromStringHashMapDefault("pt");
119+
}
120+
121+
assert (unit > 2200);
122+
}
123+
124+
@Benchmark
125+
public void markEquals() {
126+
int unit = unitFromStringEQUALS("%");
127+
unit += unitFromStringEQUALS("em");
128+
unit += unitFromStringEQUALS("ex");
129+
unit += unitFromStringEQUALS("rem");
130+
unit += unitFromStringEQUALS("rex");
131+
unit += unitFromStringEQUALS("in");
132+
unit += unitFromStringEQUALS("pt");
133+
unit += unitFromStringEQUALS("pc");
134+
unit += unitFromStringEQUALS("px");
135+
unit += unitFromStringEQUALS("deg");
136+
unit += unitFromStringEQUALS("turn");
137+
unit += unitFromStringEQUALS("ooo");
138+
unit += unitFromStringEQUALS("s");
139+
unit += unitFromStringEQUALS("ms");
140+
141+
// px and pt are very frequent
142+
for (int i = 0; i < 200; i++) {
143+
unit += unitFromStringEQUALS("px");
144+
unit += unitFromStringEQUALS("pt");
145+
}
146+
147+
assert (unit > 2200);
148+
}
149+
150+
/**
151+
* Retrieves the CSS unit associated to the given unit string.
152+
*
153+
* @param unitString the unit string.
154+
* @return the associated CSS unit, or <code>CSS_OTHER</code> if the unit is
155+
* not known.
156+
*/
157+
public static short unitFromStringHashMap(String unitString) {
158+
Short unit = unitMap.get(unitString);
159+
return unit != null ? unit.shortValue() : CSSUnit.CSS_OTHER;
160+
}
161+
162+
/**
163+
* Retrieves the CSS unit associated to the given unit string.
164+
*
165+
* @param unitString the unit string.
166+
* @return the associated CSS unit, or <code>CSS_OTHER</code> if the unit is
167+
* not known.
168+
*/
169+
public static short unitFromStringHashMapDefault(String unitString) {
170+
Short other = Short.valueOf(CSSUnit.CSS_OTHER);
171+
return unitMap.getOrDefault(unitString, other).shortValue();
172+
}
173+
174+
/**
175+
* Retrieves the CSS unit associated to the given unit string.
176+
*
177+
* @param unit the unit string (must be interned).
178+
* @return the associated CSS unit, or <code>CSS_OTHER</code> if the unit is
179+
* not known.
180+
*/
181+
public static short unitFromStringEQUALS(String unit) {
182+
if (unit == "%") {
183+
return CSSUnit.CSS_PERCENTAGE;
184+
} else if (unit == "em") {
185+
return CSSUnit.CSS_EM;
186+
} else if (unit == "ex") {
187+
return CSSUnit.CSS_EX;
188+
} else if (unit == "cap") {
189+
return CSSUnit.CSS_CAP;
190+
} else if (unit == "ch") {
191+
return CSSUnit.CSS_CH;
192+
} else if (unit == "lh") {
193+
return CSSUnit.CSS_LH;
194+
} else if (unit == "ic") {
195+
return CSSUnit.CSS_IC;
196+
} else if (unit == "rem") {
197+
return CSSUnit.CSS_REM;
198+
} else if (unit == "rex") {
199+
return CSSUnit.CSS_REX;
200+
} else if (unit == "rch") {
201+
return CSSUnit.CSS_RCH;
202+
} else if (unit == "ric") {
203+
return CSSUnit.CSS_RIC;
204+
} else if (unit == "rlh") {
205+
return CSSUnit.CSS_RLH;
206+
} else if (unit == "vw") {
207+
return CSSUnit.CSS_VW;
208+
} else if (unit == "vh") {
209+
return CSSUnit.CSS_VH;
210+
} else if (unit == "vi") {
211+
return CSSUnit.CSS_VI;
212+
} else if (unit == "vb") {
213+
return CSSUnit.CSS_VB;
214+
} else if (unit == "vmin") {
215+
return CSSUnit.CSS_VMIN;
216+
} else if (unit == "vmax") {
217+
return CSSUnit.CSS_VMAX;
218+
} else if (unit == "cm") {
219+
return CSSUnit.CSS_CM;
220+
} else if (unit == "mm") {
221+
return CSSUnit.CSS_MM;
222+
} else if (unit == "q") {
223+
return CSSUnit.CSS_QUARTER_MM;
224+
} else if (unit == "in") {
225+
return CSSUnit.CSS_IN;
226+
} else if (unit == "pt") {
227+
return CSSUnit.CSS_PT;
228+
} else if (unit == "pc") {
229+
return CSSUnit.CSS_PC;
230+
} else if (unit == "px") {
231+
return CSSUnit.CSS_PX;
232+
} else if (unit == "deg") {
233+
return CSSUnit.CSS_DEG;
234+
} else if (unit == "grad") {
235+
return CSSUnit.CSS_GRAD;
236+
} else if (unit == "rad") {
237+
return CSSUnit.CSS_RAD;
238+
} else if (unit == "turn") {
239+
return CSSUnit.CSS_TURN;
240+
} else if (unit == "s") {
241+
return CSSUnit.CSS_S;
242+
} else if (unit == "ms") {
243+
return CSSUnit.CSS_MS;
244+
} else if (unit == "hz") {
245+
return CSSUnit.CSS_HZ;
246+
} else if (unit == "khz") {
247+
return CSSUnit.CSS_KHZ;
248+
} else if (unit == "dpi") {
249+
return CSSUnit.CSS_DPI;
250+
} else if (unit == "dpcm") {
251+
return CSSUnit.CSS_DPCM;
252+
} else if (unit == "dppx") {
253+
return CSSUnit.CSS_DPPX;
254+
} else if (unit == "fr") {
255+
return CSSUnit.CSS_FR;
256+
}
257+
return CSSUnit.CSS_OTHER;
258+
}
259+
260+
}

0 commit comments

Comments
 (0)