From cf71d6bd2c370c069c03d8d80a021fa471447812 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Tue, 10 Dec 2013 16:11:34 +0100 Subject: [PATCH] avoid allocating sun.nio.cs.US_ASCII$Decoder when converting byte[] to String : 1,267,720,880 (3%) bytes in 31,693,022 (3%) objects (avg size 40 bytes) sun.nio.cs.US_ASCII.newDecoder: 1,267,720,880 (100%) bytes in 31,693,022 (100%) objects java.lang.String.: 1,267,673,560 (99%) bytes in 31,691,839 (99%) objects com.intellij.util.io.IOUtil.readUTFFast: 1,267,673,480 (99%) bytes in 31,691,837 (99%) objects --- platform/util/src/com/intellij/util/io/IOUtil.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/io/IOUtil.java b/platform/util/src/com/intellij/util/io/IOUtil.java index c10f04a78dba..625b1e693b10 100644 --- a/platform/util/src/com/intellij/util/io/IOUtil.java +++ b/platform/util/src/com/intellij/util/io/IOUtil.java @@ -18,6 +18,7 @@ package com.intellij.util.io; import com.intellij.openapi.util.ThrowableComputable; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.reference.SoftReference; import com.intellij.util.SystemProperties; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -113,6 +114,8 @@ public class IOUtil { } public static final Charset US_ASCII = Charset.forName("US-ASCII"); + private static final ThreadLocal> spareBufferLocal = new ThreadLocal>(); + public static String readUTFFast(@NotNull byte[] buffer, @NotNull DataInput storage) throws IOException { int len = 0xFF & (int)storage.readByte(); if (len == 0xFF) { @@ -126,7 +129,15 @@ public class IOUtil { if (len == 0) return ""; storage.readFully(buffer, 0, len); - return new String(buffer, 0, len, US_ASCII); + + SoftReference reference = spareBufferLocal.get(); + char[] chars = reference != null ? reference.get() : null; + if (chars == null) { + chars = new char[STRING_LENGTH_THRESHOLD]; + spareBufferLocal.set(new SoftReference(chars)); + } + for(int i = 0; i < len; ++i) chars[i] = (char)(buffer[i] &0xFF); + return new String(chars, 0, len); } public static boolean isAscii(@NotNull String str) {