diff: pre-allocate memory for StringBuilders
authorAleksey Pivovarov <Aleksey.Pivovarov@jetbrains.com>
Fri, 14 Feb 2014 14:39:37 +0000 (18:39 +0400)
committerAleksey Pivovarov <Aleksey.Pivovarov@jetbrains.com>
Fri, 14 Feb 2014 15:36:15 +0000 (19:36 +0400)
platform/util/src/com/intellij/openapi/diff/impl/ComparisonPolicy.java
platform/util/src/com/intellij/openapi/diff/impl/DiffFragmentBuilder.java
platform/util/src/com/intellij/openapi/diff/impl/highlighting/Util.java
platform/util/src/com/intellij/openapi/diff/impl/processing/ByWord.java

index e84e98cb0b5ce94141e53d461767fe69dc9f2b09..0767413e3f5b5173c89e3432ddc540c6750250a9 100644 (file)
@@ -201,18 +201,13 @@ public abstract class ComparisonPolicy {
     }
 
     private Object getWrapper(String line) {
-      line = line.trim();
-      char[] chars = new char[line.length()];
-      line.getChars(0, line.length(), chars, 0);
-      char[] result = new char[chars.length];
-      int resultLength  = 0;
-      for (int i = 0; i < chars.length; i++) {
-        char aChar = chars[i];
-        if (Character.isWhitespace(aChar)) continue;
-        result[resultLength] = aChar;
-        resultLength++;
+      StringBuilder builder = new StringBuilder(line.length());
+      for (int i = 0; i < line.length(); i++) {
+        char aChar = line.charAt(i);
+        if (StringUtil.isWhiteSpace(aChar)) continue;
+        builder.append(aChar);
       }
-      return new String(result, 0, resultLength);
+      return builder.toString();
     }
 
     @Override
index e333aca085b3e0734202fc5a400be2f039a02e64..3b6a00b16fb97cb629e8055d547daca4567ab89a 100644 (file)
@@ -156,7 +156,9 @@ public class DiffFragmentBuilder {
   }
 
   private static String concatenate(String[] strings, int start, int end) {
-    StringBuffer buffer = new StringBuffer();
+    int len = 0;
+    for (int i = start - 1; i < end; i++) len += strings[i] == null ? 0 : strings[i].length();
+    StringBuilder buffer = new StringBuilder(len);
     for (int i = start - 1; i < end; i++) buffer.append(strings[i]);
     return buffer.toString();
   }
index 0d6e1f762633c94ac7373e10318b58286791f13c..83cfa988c57317e8eb7ac628061d72a0eb7e858c 100644 (file)
@@ -232,23 +232,33 @@ public class Util {
   }
 
   public static DiffFragment concatenate(DiffFragment[] line, int from, int to) {
-    StringBuffer buffer1 = new StringBuffer();
-    StringBuffer buffer2 = new StringBuffer();
+    String[] data1 = new String[to - from];
+    String[] data2 = new String[to - from];
+
+    int len1 = 0;
+    int len2 = 0;
     boolean isEqual = true;
-    for (int j = from; j < to; j++) {
-      DiffFragment fragment = line[j];
-      isEqual &= fragment.isEqual();
-      String text1 = fragment.getText1();
-      String text2 = fragment.getText2();
-      if (text1 != null) buffer1.append(text1);
-      if (text2 != null) buffer2.append(text2);
+    for (int i = 0; i < to - from; i++) {
+      isEqual &= line[i + from].isEqual();
+      data1[i] = line[i + from].getText1();
+      data2[i] = line[i + from].getText2();
+      len1 += data1[i] == null ? 0 : data1[i].length();
+      len2 += data2[i] == null ? 0 : data2[i].length();
     }
+
+    StringBuilder buffer1 = new StringBuilder(len1);
+    StringBuilder buffer2 = new StringBuilder(len2);
+    for (int i = 0; i < to - from; i++) {
+      if (data1[i] != null) buffer1.append(data1[i]);
+      if (data2[i] != null) buffer2.append(data2[i]);
+    }
+
     String text1 = notEmptyContent(buffer1);
     String text2 = notEmptyContent(buffer2);
     return isEqual ? DiffFragment.unchanged(text1, text2) : new DiffFragment(text1, text2);
   }
 
-  private static String notEmptyContent(StringBuffer buffer) {
+  private static String notEmptyContent(StringBuilder buffer) {
     return buffer.length() > 0 ? buffer.toString() : null;
   }
 
index 7a7515af44b51f7f02d54b7d48eb0c4fa82c64d3..21740dc83a67e9dec21110fc4de3aa5cf9a8be14 100644 (file)
@@ -199,8 +199,8 @@ public class ByWord implements DiffPolicy{
         int lastIndex = myFragments.size() - 1;
         DiffFragment prevFragment = myFragments.get(lastIndex);
         if (prevFragment.isEqual()) {
-          prevFragment.appendText1(fragment.getText1());
-          prevFragment.appendText2(fragment.getText2());
+          prevFragment.appendText1(text1);
+          prevFragment.appendText2(text2);
           return;
         }
       }