]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6319 Fix perf regression for highlighting
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 1 Apr 2015 14:09:22 +0000 (16:09 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Wed, 1 Apr 2015 14:18:22 +0000 (16:18 +0200)
sonar-batch/src/test/java/org/sonar/batch/mediumtest/highlighting/HighlightingMediumTest.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/highlighting/internal/DefaultHighlighting.java
sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/highlighting/internal/DefaultHighlightingTest.java

index 8b42d6a5b670d8336c90b78fecf6edaebaee4786..96ce8e035e756a178cd7991fa6f9a1d694155d46 100644 (file)
@@ -19,9 +19,9 @@
  */
 package org.sonar.batch.mediumtest.highlighting;
 
-import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -101,16 +101,20 @@ public class HighlightingMediumTest {
     File srcDir = new File(baseDir, "src");
     srcDir.mkdir();
 
-    File xooFile = new File(srcDir, "sample.xoo");
-    File xoohighlightingFile = new File(srcDir, "sample.xoo.highlighting");
-    int chunkSize = 100000;
-    FileUtils.write(xooFile, Strings.repeat("a", chunkSize));
-    StringBuilder sb = new StringBuilder(16 * chunkSize);
-    for (int i = 0; i < chunkSize; i++) {
-      sb.append(i).append(":").append(i + 1).append(":s\n");
+    int nbFiles = 10;
+    int ruleCount = 100000;
+    int nblines = 1000;
+    int linesize = ruleCount / nblines;
+    for (int nb = 1; nb <= nbFiles; nb++) {
+      File xooFile = new File(srcDir, "sample" + nb + ".xoo");
+      File xoohighlightingFile = new File(srcDir, "sample" + nb + ".xoo.highlighting");
+      FileUtils.write(xooFile, StringUtils.repeat(StringUtils.repeat("a", linesize) + "\n", nblines));
+      StringBuilder sb = new StringBuilder(16 * ruleCount);
+      for (int i = 0; i < ruleCount; i++) {
+        sb.append(i).append(":").append(i + 1).append(":s\n");
+      }
+      FileUtils.write(xoohighlightingFile, sb.toString());
     }
-    FileUtils.write(xoohighlightingFile, sb.toString());
-
     long start = System.currentTimeMillis();
     TaskResult result = tester.newTask()
       .properties(ImmutableMap.<String, String>builder()
@@ -125,9 +129,6 @@ public class HighlightingMediumTest {
       .start();
     System.out.println("Duration: " + (System.currentTimeMillis() - start));
 
-    InputFile file = result.inputFile("src/sample.xoo");
-    assertThat(result.highlightingTypeFor(file, 1, 0)).containsExactly(TypeOfText.STRING);
-
   }
 
 }
index 50bb7cbab3098c1ea7976bcb05af1897f54d90ba..ee42c236353343e7038ed3091d627656074a1c23 100644 (file)
@@ -20,7 +20,6 @@
 package org.sonar.api.batch.sensor.highlighting.internal;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.Sets;
 import org.sonar.api.batch.fs.InputFile;
 import org.sonar.api.batch.fs.internal.DefaultInputFile;
 import org.sonar.api.batch.sensor.highlighting.NewHighlighting;
@@ -30,14 +29,12 @@ import org.sonar.api.batch.sensor.internal.SensorStorage;
 
 import javax.annotation.Nullable;
 
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Set;
+import java.util.*;
 
 public class DefaultHighlighting extends DefaultStorable implements NewHighlighting {
 
   private DefaultInputFile inputFile;
-  private Set<SyntaxHighlightingRule> syntaxHighlightingRuleSet;
+  private List<SyntaxHighlightingRule> syntaxHighlightingRules;
 
   public DefaultHighlighting() {
     this(null);
@@ -45,25 +42,16 @@ public class DefaultHighlighting extends DefaultStorable implements NewHighlight
 
   public DefaultHighlighting(@Nullable SensorStorage storage) {
     super(storage);
-    syntaxHighlightingRuleSet = Sets.newTreeSet(new Comparator<SyntaxHighlightingRule>() {
-      @Override
-      public int compare(SyntaxHighlightingRule left, SyntaxHighlightingRule right) {
-        int result = left.range().start().compareTo(right.range().start());
-        if (result == 0) {
-          result = right.range().end().compareTo(left.range().end());
-        }
-        return result;
-      }
-    });
+    syntaxHighlightingRules = new ArrayList<>();
   }
 
-  public Set<SyntaxHighlightingRule> getSyntaxHighlightingRuleSet() {
-    return syntaxHighlightingRuleSet;
+  public List<SyntaxHighlightingRule> getSyntaxHighlightingRuleSet() {
+    return syntaxHighlightingRules;
   }
 
   private void checkOverlappingBoudaries() {
-    if (syntaxHighlightingRuleSet.size() > 1) {
-      Iterator<SyntaxHighlightingRule> it = syntaxHighlightingRuleSet.iterator();
+    if (syntaxHighlightingRules.size() > 1) {
+      Iterator<SyntaxHighlightingRule> it = syntaxHighlightingRules.iterator();
       SyntaxHighlightingRule previous = it.next();
       while (it.hasNext()) {
         SyntaxHighlightingRule current = it.next();
@@ -92,13 +80,24 @@ public class DefaultHighlighting extends DefaultStorable implements NewHighlight
   public DefaultHighlighting highlight(int startOffset, int endOffset, TypeOfText typeOfText) {
     Preconditions.checkState(inputFile != null, "Call onFile() first");
     SyntaxHighlightingRule syntaxHighlightingRule = SyntaxHighlightingRule.create(inputFile.newRange(startOffset, endOffset), typeOfText);
-    this.syntaxHighlightingRuleSet.add(syntaxHighlightingRule);
+    this.syntaxHighlightingRules.add(syntaxHighlightingRule);
     return this;
   }
 
   @Override
   protected void doSave() {
     Preconditions.checkState(inputFile != null, "Call onFile() first");
+    // Sort rules to avoid variation during consecutive runs
+    Collections.sort(syntaxHighlightingRules, new Comparator<SyntaxHighlightingRule>() {
+      @Override
+      public int compare(SyntaxHighlightingRule left, SyntaxHighlightingRule right) {
+        int result = left.range().start().compareTo(right.range().start());
+        if (result == 0) {
+          result = right.range().end().compareTo(left.range().end());
+        }
+        return result;
+      }
+    });
     checkOverlappingBoudaries();
     storage.store(this);
   }
index 79f7db9e06b92c8d548c1d274e3b11fa6cd3e52f..03726d4d74aaa5c9bf8db6b67ef973108937c662 100644 (file)
@@ -52,7 +52,7 @@ public class DefaultHighlightingTest {
   @Before
   public void setUpSampleRules() {
 
-    DefaultHighlighting highlightingDataBuilder = new DefaultHighlighting()
+    DefaultHighlighting highlightingDataBuilder = new DefaultHighlighting(mock(SensorStorage.class))
       .onFile(INPUT_FILE)
       .highlight(0, 10, COMMENT)
       .highlight(10, 12, KEYWORD)
@@ -61,6 +61,8 @@ public class DefaultHighlightingTest {
       .highlight(24, 65, CPP_DOC)
       .highlight(12, 20, COMMENT);
 
+    highlightingDataBuilder.save();
+
     highlightingRules = highlightingDataBuilder.getSyntaxHighlightingRuleSet();
   }