Skip to content

Commit f4464c2

Browse files
authored
Speed up StringUtils.getDigits(String)
Local results: ``` Benchmark (length) Mode Cnt Score Error Units StringUtilsGetDigitsBenchmark.testGetDigitsManually 10 avgt 25 19.835 ± 0.321 ns/op StringUtilsGetDigitsBenchmark.testGetDigitsManually 100 avgt 25 91.149 ± 1.234 ns/op StringUtilsGetDigitsBenchmark.testGetDigitsManually 1000 avgt 25 777.029 ± 9.725 ns/op StringUtilsGetDigitsBenchmark.testGetDigitsManually 10000 avgt 25 7883.407 ± 61.312 ns/op StringUtilsGetDigitsBenchmark.testGetDigitsWithBuilder 10 avgt 25 84.027 ± 36.391 ns/op StringUtilsGetDigitsBenchmark.testGetDigitsWithBuilder 100 avgt 25 334.174 ± 225.501 ns/op StringUtilsGetDigitsBenchmark.testGetDigitsWithBuilder 1000 avgt 25 1700.380 ± 2.512 ns/op StringUtilsGetDigitsBenchmark.testGetDigitsWithBuilder 10000 avgt 25 16191.400 ± 18.637 ns/op ```
1 parent ecdd2d3 commit f4464c2

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/main/java/org/apache/commons/lang3/StringUtils.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2043,15 +2043,17 @@ public static String getDigits(final String str) {
20432043
if (isEmpty(str)) {
20442044
return str;
20452045
}
2046-
final int sz = str.length();
2047-
final StringBuilder strDigits = new StringBuilder(sz);
2048-
for (int i = 0; i < sz; i++) {
2046+
final int len = str.length();
2047+
final char[] buffer = new char[len];
2048+
int count = 0;
2049+
2050+
for (int i = 0; i < len; i++) {
20492051
final char tempChar = str.charAt(i);
20502052
if (Character.isDigit(tempChar)) {
2051-
strDigits.append(tempChar);
2053+
buffer[count++] = tempChar;
20522054
}
20532055
}
2054-
return strDigits.toString();
2056+
return new String(buffer, 0, count);
20552057
}
20562058

20572059
/**

0 commit comments

Comments
 (0)