diff --git a/.idea/libraries/lz4_java.xml b/.idea/libraries/lz4_java.xml
new file mode 100644
index 000000000000..c21548affc50
--- /dev/null
+++ b/.idea/libraries/lz4_java.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/lz4-java-1.3.jar b/lib/lz4-java-1.3.jar
new file mode 100644
index 000000000000..617d61e0af07
Binary files /dev/null and b/lib/lz4-java-1.3.jar differ
diff --git a/lib/src/lz4-java-1.3-src.jar b/lib/src/lz4-java-1.3-src.jar
new file mode 100644
index 000000000000..afd783abff7e
Binary files /dev/null and b/lib/src/lz4-java-1.3-src.jar differ
diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/CommunityLibraryLicenses.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/CommunityLibraryLicenses.groovy
index 9a04a5cf841c..44e64bb44ed3 100644
--- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/CommunityLibraryLicenses.groovy
+++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/CommunityLibraryLicenses.groovy
@@ -243,6 +243,8 @@ class CommunityLibraryLicenses {
url: "http://logging.apache.org/log4j/1.2/index.html", licenseUrl: "http://www.apache.org/licenses/LICENSE-2.0"),
new LibraryLicense(name: "Lombok AST", libraryName: "lombok-ast", version: "0.2.1", license: "MIT", url: "http://projectlombok.org/",
licenseUrl: "http://opensource.org/licenses/mit-license.php"),
+ new LibraryLicense(name: "lz4-java", libraryName: "lz4-java", version: "1.3", license: "Apache 2.0", url: "https://github.com/lz4/lz4-java",
+ licenseUrl: "https://github.com/lz4/lz4-java/blob/master/LICENSE.txt"),
new LibraryLicense(name: "markdown4j", libraryName: "markdown4j-2.2", version: "2.2", license: "New BSD",
url: "https://code.google.com/p/markdown4j/", licenseUrl: "http://opensource.org/licenses/BSD-3-Clause"),
new LibraryLicense(name: "markdownj", attachedTo: "tasks-core", version: "", license: "BSD", url: "https://github.com/myabc/markdownj",
diff --git a/platform/util/src/com/intellij/openapi/application/PathManager.java b/platform/util/src/com/intellij/openapi/application/PathManager.java
index 7818d02bc5c9..67343efdfdab 100644
--- a/platform/util/src/com/intellij/openapi/application/PathManager.java
+++ b/platform/util/src/com/intellij/openapi/application/PathManager.java
@@ -28,6 +28,7 @@ import com.intellij.util.io.URLUtil;
import com.sun.jna.TypeMapper;
import com.sun.jna.platform.FileUtils;
import gnu.trove.THashSet;
+import net.jpountz.lz4.LZ4Factory;
import org.apache.log4j.Appender;
import org.apache.oro.text.regex.PatternMatcher;
import org.intellij.lang.annotations.Flow;
@@ -515,6 +516,7 @@ public class PathManager {
FileUtils.class, // JNA (jna-platform)
PatternMatcher.class, // OROMatcher
Snappy.class, // Snappy
+ LZ4Factory.class, // Snappy
};
final Set classPath = new HashSet();
diff --git a/platform/util/src/com/intellij/util/CompressionUtil.java b/platform/util/src/com/intellij/util/CompressionUtil.java
index 8ea0e35c8782..3ecc3596ec17 100644
--- a/platform/util/src/com/intellij/util/CompressionUtil.java
+++ b/platform/util/src/com/intellij/util/CompressionUtil.java
@@ -19,6 +19,8 @@ import com.intellij.openapi.util.ThreadLocalCachedByteArray;
import com.intellij.util.io.DataInputOutputUtil;
import com.intellij.util.io.DataOutputStream;
import com.intellij.util.text.StringFactory;
+import net.jpountz.lz4.LZ4Compressor;
+import net.jpountz.lz4.LZ4Factory;
import org.iq80.snappy.CorruptionException;
import org.iq80.snappy.Snappy;
import org.jetbrains.annotations.NotNull;
@@ -60,12 +62,22 @@ public class CompressionUtil {
private static final AtomicLong mySizeAfterCompression = new AtomicLong();
public static final boolean DUMP_COMPRESSION_STATS = SystemProperties.getBooleanProperty("idea.dump.compression.stats", false);
+ public static final boolean USE_SNAPPY = SystemProperties.getBooleanProperty("idea.use.snappy", true);
public static int writeCompressedWithoutOriginalBufferLength(@NotNull DataOutput out, @NotNull byte[] bytes, int length) throws IOException {
long started = DUMP_COMPRESSION_STATS ? System.nanoTime() : 0;
- final byte[] compressedOutputBuffer = spareBufferLocal.getBuffer(Snappy.maxCompressedLength(length));
- int compressedSize = Snappy.compress(bytes, 0, length, compressedOutputBuffer, 0);
+ final byte[] compressedOutputBuffer;
+ int compressedSize;
+
+ if (USE_SNAPPY) {
+ compressedOutputBuffer = spareBufferLocal.getBuffer(Snappy.maxCompressedLength(length));
+ compressedSize = Snappy.compress(bytes, 0, length, compressedOutputBuffer, 0);
+ } else {
+ LZ4Compressor compressor = LZ4Factory.fastestJavaInstance().fastCompressor();
+ compressedOutputBuffer = spareBufferLocal.getBuffer(compressor.maxCompressedLength(length));
+ compressedSize = compressor.compress(bytes, 0, length, compressedOutputBuffer, 0);
+ }
final long time = (DUMP_COMPRESSION_STATS ? System.nanoTime() : 0) - started;
mySizeAfterCompression.addAndGet(compressedSize);
@@ -93,7 +105,13 @@ public class CompressionUtil {
int decompressedRequests = myDecompressionRequests.incrementAndGet();
long started = DUMP_COMPRESSION_STATS ? System.nanoTime() : 0;
- byte[] decompressedResult = Snappy.uncompress(bytes, 0, size);
+ final byte[] decompressedResult;
+
+ if (USE_SNAPPY) {
+ decompressedResult = Snappy.uncompress(bytes, 0, size);
+ } else {
+ decompressedResult = LZ4Factory.fastestJavaInstance().fastDecompressor().decompress(bytes, 0, 32768);
+ }
long doneTime = (DUMP_COMPRESSION_STATS ? System.nanoTime() : 0) - started;
long decompressedSize = myDecompressedSize.addAndGet(size);
diff --git a/platform/util/util.iml b/platform/util/util.iml
index b52f0341eb7c..2bdfa029d932 100644
--- a/platform/util/util.iml
+++ b/platform/util/util.iml
@@ -24,6 +24,7 @@
+