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 @@ +