Browse Source

SONAR-6319 Fix perf regression for highlighting

tags/5.2-RC1
Julien HENRY 9 years ago
parent
commit
8878a2822b

+ 14
- 13
sonar-batch/src/test/java/org/sonar/batch/mediumtest/highlighting/HighlightingMediumTest.java View 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);

}

}

+ 19
- 20
sonar-plugin-api/src/main/java/org/sonar/api/batch/sensor/highlighting/internal/DefaultHighlighting.java View 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);
}

+ 3
- 1
sonar-plugin-api/src/test/java/org/sonar/api/batch/sensor/highlighting/internal/DefaultHighlightingTest.java View 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();
}


Loading…
Cancel
Save