Skip to content

Commit 528be80

Browse files
SONARJAVA-5612 Add performance benchmark table to S2864, S1643 and S4635 (#5209)
1 parent da89c8b commit 528be80

4 files changed

Lines changed: 315 additions & 1 deletion

File tree

sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S1643.html

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,105 @@ <h3>Compliant solution</h3>
1818
}
1919
String str = bld.toString();
2020
</pre>
21+
<table>
22+
<colgroup>
23+
<col style="width: 20%;">
24+
<col style="width: 20%;">
25+
<col style="width: 20%;">
26+
<col style="width: 20%;">
27+
<col style="width: 20%;">
28+
</colgroup>
29+
<thead>
30+
<tr>
31+
<th>Method</th>
32+
<th>size</th>
33+
<th>Runtime</th>
34+
<th>Average time</th>
35+
<th>Error margin</th>
36+
</tr>
37+
</thead>
38+
<tbody>
39+
<tr>
40+
<td><p>plus</p></td>
41+
<td><p>100</p></td>
42+
<td><p>Temurin 21</p></td>
43+
<td><p>4.19 µs/op</p></td>
44+
<td><p>±0.34 µs/op</p></td>
45+
</tr>
46+
<tr>
47+
<td><p>plus</p></td>
48+
<td><p>1000</p></td>
49+
<td><p>Temurin 21</p></td>
50+
<td><p>377.08 µs/op</p></td>
51+
<td><p>±17.36 µs/op</p></td>
52+
</tr>
53+
<tr>
54+
<td><p>plus</p></td>
55+
<td><p>10000</p></td>
56+
<td><p>Temurin 21</p></td>
57+
<td><p>40221.49 µs/op</p></td>
58+
<td><p>±1342.76 µs/op</p></td>
59+
</tr>
60+
<tr>
61+
<td><p>plus</p></td>
62+
<td><p>100000</p></td>
63+
<td><p>Temurin 21</p></td>
64+
<td><p>5286840.53 µs/op</p></td>
65+
<td><p>±185796.75 µs/op</p></td>
66+
</tr>
67+
<tr>
68+
<td><p>stringBuilder</p></td>
69+
<td><p>100</p></td>
70+
<td><p>Temurin 21</p></td>
71+
<td><p>0.97 µs/op</p></td>
72+
<td><p>±0.03 µs/op</p></td>
73+
</tr>
74+
<tr>
75+
<td><p>stringBuilder</p></td>
76+
<td><p>1000</p></td>
77+
<td><p>Temurin 21</p></td>
78+
<td><p>10.25 µs/op</p></td>
79+
<td><p>±1.64 µs/op</p></td>
80+
</tr>
81+
<tr>
82+
<td><p>stringBuilder</p></td>
83+
<td><p>10000</p></td>
84+
<td><p>Temurin 21</p></td>
85+
<td><p>93.27 µs/op</p></td>
86+
<td><p>±16.05 µs/op</p></td>
87+
</tr>
88+
<tr>
89+
<td><p>stringBuilder</p></td>
90+
<td><p>100000</p></td>
91+
<td><p>Temurin 21</p></td>
92+
<td><p>1019.91 µs/op</p></td>
93+
<td><p>±69.58 µs/op</p></td>
94+
</tr>
95+
</tbody>
96+
</table>
97+
<p><strong>Benchmarking code</strong></p>
98+
<p>The results were generated by running the following snippet with <a href="https://github.com/openjdk/jmh">JMH</a>.</p>
99+
<pre>
100+
@Param({"100", "1000", "10000", "100000"})
101+
int size;
102+
private String word = "append";
103+
104+
@Benchmark
105+
public String plus() {
106+
String str = "";
107+
for (int i = 0; i &lt; size; i++) {
108+
str = str + word;
109+
}
110+
return str;
111+
}
112+
113+
@Benchmark
114+
public String stringBuilder() {
115+
StringBuilder builder = new StringBuilder();
116+
for (int i = 0; i &lt; size; i++) {
117+
builder.append(word);
118+
}
119+
return builder.toString();
120+
}
121+
</pre>
21122

sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S2864.html

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,109 @@ <h3>Compliant solution</h3>
2424
}
2525
}
2626
</pre>
27+
<h3>Benchmarks</h3>
28+
<table>
29+
<colgroup>
30+
<col style="width: 20%;">
31+
<col style="width: 20%;">
32+
<col style="width: 20%;">
33+
<col style="width: 20%;">
34+
<col style="width: 20%;">
35+
</colgroup>
36+
<thead>
37+
<tr>
38+
<th>Method</th>
39+
<th>size</th>
40+
<th>Runtime</th>
41+
<th>Average time</th>
42+
<th>Error margin</th>
43+
</tr>
44+
</thead>
45+
<tbody>
46+
<tr>
47+
<td><p>usingEntrySet</p></td>
48+
<td><p>10</p></td>
49+
<td><p>Temurin 21</p></td>
50+
<td><p>27.48 ns/op</p></td>
51+
<td><p>±6.22 ns/op</p></td>
52+
</tr>
53+
<tr>
54+
<td><p>usingEntrySet</p></td>
55+
<td><p>1000</p></td>
56+
<td><p>Temurin 21</p></td>
57+
<td><p>2480.26 ns/op</p></td>
58+
<td><p>±899.05 ns/op</p></td>
59+
</tr>
60+
<tr>
61+
<td><p>usingEntrySet</p></td>
62+
<td><p>10000</p></td>
63+
<td><p>Temurin 21</p></td>
64+
<td><p>22745.78 ns/op</p></td>
65+
<td><p>±10505.46 ns/op</p></td>
66+
</tr>
67+
<tr>
68+
<td><p>usingKeySet</p></td>
69+
<td><p>10</p></td>
70+
<td><p>Temurin 21</p></td>
71+
<td><p>49.70 ns/op</p></td>
72+
<td><p>±3.78 ns/op</p></td>
73+
</tr>
74+
<tr>
75+
<td><p>usingKeySet</p></td>
76+
<td><p>1000</p></td>
77+
<td><p>Temurin 21</p></td>
78+
<td><p>5061.54 ns/op</p></td>
79+
<td><p>±2056.60 ns/op</p></td>
80+
</tr>
81+
<tr>
82+
<td><p>usingKeySet</p></td>
83+
<td><p>10000</p></td>
84+
<td><p>Temurin 21</p></td>
85+
<td><p>46689.04 ns/op</p></td>
86+
<td><p>±14509.97 ns/op</p></td>
87+
</tr>
88+
</tbody>
89+
</table>
90+
<p><strong>Benchmarking code</strong></p>
91+
<p>The results were generated by running the following snippet with <a href="https://github.com/openjdk/jmh">JMH</a>.</p>
92+
<pre>
93+
@BenchmarkMode({Mode.AverageTime})
94+
@OutputTimeUnit(TimeUnit.NANOSECONDS)
95+
@State(Scope.Benchmark)
96+
public class S2864 {
97+
@Param({"10", "1000", "10000"})
98+
int size;
99+
100+
Map&lt;Integer,Integer&gt; map;
101+
102+
@Setup(Level.Trial)
103+
public void setup() {
104+
Random random = new Random();
105+
map = new HashMap&lt;&gt;();
106+
for (int i = 0; i &lt; size; i++) {
107+
map.put(i, random.nextInt());
108+
}
109+
}
110+
111+
@Benchmark
112+
public int usingKeySet() {
113+
int sumKeysValues = 0;
114+
for (Integer key : map.keySet()) {
115+
sumKeysValues += key + map.get(key);
116+
}
117+
return sumKeysValues;
118+
}
119+
120+
@Benchmark
121+
public int usingEntrySet() {
122+
int sumKeysValues = 0;
123+
for (Map.Entry&lt;Integer, Integer&gt; entry : map.entrySet()) {
124+
sumKeysValues += entry.getKey() + entry.getValue();
125+
}
126+
return sumKeysValues;
127+
}
128+
}
129+
</pre>
27130
<h2>Resources</h2>
28131
<h3>Documentation</h3>
29132
<ul>

sonar-java-plugin/src/main/resources/org/sonar/l10n/java/rules/java/S4635.html

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,114 @@ <h3>Compliant solution</h3>
2121
<pre>
2222
str.indexOf(char1, beginIndex) - beginIndex; // index for char1 not found is (-1-beginIndex)
2323
</pre>
24+
<h2>Resources</h2>
25+
<h3>Benchmarks</h3>
26+
<table>
27+
<colgroup>
28+
<col style="width: 20%;">
29+
<col style="width: 20%;">
30+
<col style="width: 20%;">
31+
<col style="width: 20%;">
32+
<col style="width: 20%;">
33+
</colgroup>
34+
<thead>
35+
<tr>
36+
<th>Method</th>
37+
<th>stringSize</th>
38+
<th>Runtime</th>
39+
<th>Average time</th>
40+
<th>Error margin</th>
41+
</tr>
42+
</thead>
43+
<tbody>
44+
<tr>
45+
<td><p>indexOfOnly</p></td>
46+
<td><p>10</p></td>
47+
<td><p>Temurin 21</p></td>
48+
<td><p>1.55 ns/op</p></td>
49+
<td><p>±0.12 ns/op</p></td>
50+
</tr>
51+
<tr>
52+
<td><p>indexOfOnly</p></td>
53+
<td><p>100</p></td>
54+
<td><p>Temurin 21</p></td>
55+
<td><p>1.78 ns/op</p></td>
56+
<td><p>±0.05 ns/op</p></td>
57+
</tr>
58+
<tr>
59+
<td><p>indexOfOnly</p></td>
60+
<td><p>1000</p></td>
61+
<td><p>Temurin 21</p></td>
62+
<td><p>1.82 ns/op</p></td>
63+
<td><p>±0.18 ns/op</p></td>
64+
</tr>
65+
<tr>
66+
<td><p>indexOfOnly</p></td>
67+
<td><p>10000</p></td>
68+
<td><p>Temurin 21</p></td>
69+
<td><p>1.77 ns/op</p></td>
70+
<td><p>±0.08 ns/op</p></td>
71+
</tr>
72+
<tr>
73+
<td><p>substringThenIndexOf</p></td>
74+
<td><p>10</p></td>
75+
<td><p>Temurin 21</p></td>
76+
<td><p>4.85 ns/op</p></td>
77+
<td><p>±0.41 ns/op</p></td>
78+
</tr>
79+
<tr>
80+
<td><p>substringThenIndexOf</p></td>
81+
<td><p>100</p></td>
82+
<td><p>Temurin 21</p></td>
83+
<td><p>6.22 ns/op</p></td>
84+
<td><p>±0.40 ns/op</p></td>
85+
</tr>
86+
<tr>
87+
<td><p>substringThenIndexOf</p></td>
88+
<td><p>1000</p></td>
89+
<td><p>Temurin 21</p></td>
90+
<td><p>14.22 ns/op</p></td>
91+
<td><p>±1.66 ns/op</p></td>
92+
</tr>
93+
<tr>
94+
<td><p>substringThenIndexOf</p></td>
95+
<td><p>10000</p></td>
96+
<td><p>Temurin 21</p></td>
97+
<td><p>275.00 ns/op</p></td>
98+
<td><p>±20.49 ns/op</p></td>
99+
</tr>
100+
</tbody>
101+
</table>
102+
<p><strong>Benchmarking code</strong></p>
103+
<p>The results were generated by running the following snippet with <a href="https://github.com/openjdk/jmh">JMH</a>.</p>
104+
<pre>
105+
@BenchmarkMode({Mode.AverageTime})
106+
@OutputTimeUnit(TimeUnit.NANOSECONDS)
107+
@State(Scope.Benchmark)
108+
public class S4635 {
109+
@Param({"10", "100", "1000", "10000"})
110+
int stringSize;
111+
112+
String input;
113+
114+
@Setup
115+
public void setup() {
116+
StringBuilder builder = new StringBuilder();
117+
for (int i = 0; i &lt; stringSize; i++) {
118+
builder.append('a');
119+
}
120+
input = builder.toString();
121+
}
122+
123+
@Benchmark
124+
public int substringThenIndexOf() {
125+
return stringSize / 2 + input.substring(stringSize / 2).indexOf('a');
126+
}
127+
128+
@Benchmark
129+
public int indexOfOnly() {
130+
return input.indexOf('a', stringSize / 2);
131+
}
132+
}
133+
</pre>
24134

sonarpedia.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"languages": [
44
"JAVA"
55
],
6-
"latest-update": "2025-05-28T09:17:51.640344029Z",
6+
"latest-update": "2025-06-23T12:44:09.599349313Z",
77
"options": {
88
"no-language-in-filenames": true,
99
"preserve-filenames": false

0 commit comments

Comments
 (0)