Skip to content

Commit 2bed457

Browse files
TobiXslawekjaranowski
authored andcommitted
Add a simple cache for ComparableVersions
This can improve performance in pathetic corner cases by up to 50%.
1 parent 2d7a157 commit 2bed457

4 files changed

Lines changed: 18 additions & 4 deletions

File tree

versions-common/src/main/java/org/codehaus/mojo/versions/ordering/BoundArtifactVersion.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public int compareTo(ArtifactVersion other) {
5656
return -1;
5757
}
5858

59-
return comparator.compareTo(new ComparableVersion(other.toString()));
59+
return comparator.compareTo(ComparableVersion.of(other.toString()));
6060
}
6161

6262
@Override

versions-common/src/main/java/org/codehaus/mojo/versions/ordering/ComparableVersion.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626
import java.util.List;
2727
import java.util.ListIterator;
2828
import java.util.Locale;
29+
import java.util.Map;
2930
import java.util.Properties;
3031
import java.util.Stack;
32+
import java.util.concurrent.ConcurrentHashMap;
3133

3234
/**
3335
* Generic implementation of version comparison.
@@ -37,6 +39,8 @@
3739
* Note: The implementation of the maven core should be used.
3840
*/
3941
public class ComparableVersion implements Comparable<ComparableVersion> {
42+
private static final Map<String, ComparableVersion> CACHE = new ConcurrentHashMap<>();
43+
4044
private String value;
4145

4246
private String canonical;
@@ -283,7 +287,17 @@ public String toString() {
283287
}
284288
}
285289

286-
public ComparableVersion(String version) {
290+
/**
291+
* Get a ComparableVersion representing the version in a string.
292+
*/
293+
public static ComparableVersion of(String version) {
294+
return CACHE.computeIfAbsent(version, ComparableVersion::new);
295+
}
296+
297+
/**
298+
* Create a ComparableVersion from a string. Try to avoid using this and instead use the cache by calling {@link #of(String)}
299+
*/
300+
protected ComparableVersion(String version) {
287301
parseVersion(version);
288302
}
289303

versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MavenVersionComparator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public int compare(ArtifactVersion o1, ArtifactVersion o2) {
3939
if (o1 instanceof BoundArtifactVersion) {
4040
return o1.compareTo(o2);
4141
}
42-
return new ComparableVersion(o1.toString()).compareTo(new ComparableVersion(o2.toString()));
42+
return ComparableVersion.of(o1.toString()).compareTo(ComparableVersion.of(o2.toString()));
4343
}
4444

4545
/**

versions-common/src/main/java/org/codehaus/mojo/versions/ordering/MercuryVersionComparator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class MercuryVersionComparator extends AbstractVersionComparator {
4040
* {@inheritDoc}
4141
*/
4242
public int compare(ArtifactVersion o1, ArtifactVersion o2) {
43-
return new ComparableVersion(o1.toString()).compareTo(new ComparableVersion(o2.toString()));
43+
return ComparableVersion.of(o1.toString()).compareTo(ComparableVersion.of(o2.toString()));
4444
}
4545

4646
protected int innerGetSegmentCount(ArtifactVersion v) {

0 commit comments

Comments
 (0)