]> source.dussan.org Git - sonarqube.git/commitdiff
Cache common Doubles in Measures
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Tue, 30 Jul 2019 20:44:06 +0000 (15:44 -0500)
committerSonarTech <sonartech@sonarsource.com>
Wed, 4 Sep 2019 18:21:04 +0000 (20:21 +0200)
server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/measure/Measure.java
server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/metric/MetricDtoToMetric.java
server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/util/cache/DoubleCache.java [new file with mode: 0644]

index bbefe1b6f6beaa5a70418e01d00a9375a900ae5e..5b4872f962d087ba3a097acd0bf1e1d625861368 100644 (file)
@@ -25,6 +25,7 @@ import java.util.Locale;
 import java.util.Optional;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
+import org.sonar.ce.task.projectanalysis.util.cache.DoubleCache;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
@@ -81,11 +82,10 @@ public final class Measure {
   @CheckForNull
   private final Double variation;
 
-  private Measure(ValueType valueType,
-    @Nullable Double value, @Nullable String data, @Nullable Level dataLevel,
+  private Measure(ValueType valueType, @Nullable Double value, @Nullable String data, @Nullable Level dataLevel,
     @Nullable QualityGateStatus qualityGateStatus, @Nullable Double variation) {
     this.valueType = valueType;
-    this.value = value;
+    this.value = DoubleCache.intern(value);
     this.data = data;
     this.dataLevel = dataLevel;
     this.qualityGateStatus = qualityGateStatus;
@@ -178,7 +178,7 @@ public final class Measure {
     /**
      * Sets the QualityGateStatus of the updated Measure to create.
      *
-     * @throws NullPointerException if the specified {@link QualityGateStatus} is {@code null}
+     * @throws NullPointerException          if the specified {@link QualityGateStatus} is {@code null}
      * @throws UnsupportedOperationException if the source measure already has a {@link QualityGateStatus}
      */
     public UpdateMeasureBuilder setQualityGateStatus(QualityGateStatus qualityGateStatus) {
index 9fd29f886f2bf07ffe4f337e5dc155e42564f660..f3ecac638ecda9c0c983faf7df2781583cb469f9 100644 (file)
@@ -21,8 +21,9 @@ package org.sonar.ce.task.projectanalysis.metric;
 
 import com.google.common.base.Function;
 import javax.annotation.Nonnull;
-import org.sonar.db.metric.MetricDto;
 import org.sonar.ce.task.projectanalysis.measure.Measure;
+import org.sonar.ce.task.projectanalysis.util.cache.DoubleCache;
+import org.sonar.db.metric.MetricDto;
 
 import static com.google.common.base.MoreObjects.firstNonNull;
 
@@ -43,6 +44,6 @@ public enum MetricDtoToMetric implements Function<MetricDto, Metric> {
     return new MetricImpl(
       metricDto.getId(), metricDto.getKey(), metricDto.getShortName(), metricType,
       decimalScale,
-      metricDto.getBestValue(), metricDto.isOptimizedBestValue());
+      DoubleCache.intern(metricDto.getBestValue()), metricDto.isOptimizedBestValue());
   }
 }
diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/util/cache/DoubleCache.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/util/cache/DoubleCache.java
new file mode 100644 (file)
index 0000000..5b51ad8
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2019 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.ce.task.projectanalysis.util.cache;
+
+import javax.annotation.Nullable;
+
+public class DoubleCache {
+  private static final Double ONE = 1.0;
+  private static final Double HUNDRED = 100.0;
+  private static final Double ZERO = 0.0;
+
+  private DoubleCache() {
+    // static only
+  }
+
+  public static Double intern(@Nullable Double num) {
+    if (ZERO.equals(num)) {
+      return ZERO;
+    }
+    if (ONE.equals(num)) {
+      return ONE;
+    }
+    if (HUNDRED.equals(num)) {
+      return HUNDRED;
+    }
+    return num;
+  }
+}