diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/NioUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/NioUtil.java index c794fc425..3cb351332 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/NioUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/NioUtil.java @@ -41,6 +41,11 @@ import java.nio.charset.Charset; */ public class NioUtil { + /** + * 默认小缓存大小 1024 + */ + public static final int DEFAULT_SMALL_BUFFER_SIZE = 2 << 9; + /** * 默认缓存大小 8192 */ diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastByteBuffer.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastByteBuffer.java index da978d5dc..5255152b6 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastByteBuffer.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastByteBuffer.java @@ -41,7 +41,7 @@ public class FastByteBuffer extends FastBuffer { * 构造 */ public FastByteBuffer() { - this(IoUtil.DEFAULT_BUFFER_SIZE); + this(IoUtil.DEFAULT_SMALL_BUFFER_SIZE); } /** diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastCharBuffer.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastCharBuffer.java index f543b6729..7eb759230 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastCharBuffer.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastCharBuffer.java @@ -21,7 +21,8 @@ import org.dromara.hutool.core.lang.Assert; /** * 代码移植自jetbrick
- * 快速字符缓冲,将数据存放在缓冲集中,取代以往的单一数组 + * 快速字符缓冲,将数据存放在缓冲集中,取代以往的单一数组
+ * 注意:此缓存在大量重复append时,性能比{@link StringBuilder}要好,但是{@link #toArray()}性能很差 * * @author jetbrick, looly */ @@ -40,7 +41,7 @@ public class FastCharBuffer extends FastBuffer implements CharSequence, Appendab * 构造 */ public FastCharBuffer() { - this(IoUtil.DEFAULT_BUFFER_SIZE); + this(IoUtil.DEFAULT_SMALL_BUFFER_SIZE); } /** diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/io/BufferUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/BufferUtilTest.java similarity index 96% rename from hutool-core/src/test/java/org/dromara/hutool/core/io/BufferUtilTest.java rename to hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/BufferUtilTest.java index 72f565cde..63530e36c 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/io/BufferUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/BufferUtilTest.java @@ -14,16 +14,15 @@ * limitations under the License. */ -package org.dromara.hutool.core.io; +package org.dromara.hutool.core.io.buffer; -import java.nio.ByteBuffer; - -import org.dromara.hutool.core.io.buffer.BufferUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.CharsetUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.nio.ByteBuffer; + /** * BufferUtil单元测试 * diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/CharBufferJmh.java b/hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/CharBufferJmh.java new file mode 100644 index 000000000..7dcda187a --- /dev/null +++ b/hutool-core/src/test/java/org/dromara/hutool/core/io/buffer/CharBufferJmh.java @@ -0,0 +1,40 @@ +package org.dromara.hutool.core.io.buffer; + +import org.openjdk.jmh.annotations.*; + +import java.util.concurrent.TimeUnit; + +@BenchmarkMode(Mode.AverageTime)//每次执行平均花费时间 +@Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS) //预热1次调用 +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) // 执行5此,每次1秒 +@Threads(1) //单线程 +@Fork(1) // +@OutputTimeUnit(TimeUnit.NANOSECONDS) // 单位:纳秒 +@State(Scope.Benchmark) // 共享域 +public class CharBufferJmh { + + private final int appendCount = 10000; + private String str; + + @Setup + public void setup() { + str = "abc123你好"; + } + + @SuppressWarnings("MismatchedQueryAndUpdateOfStringBuilder") + @Benchmark + public void stringBuilderJmh() { + final StringBuilder stringBuilder = new StringBuilder(1024); + for (int i = 0; i < appendCount; i++) { + stringBuilder.append(str); + } + } + + @Benchmark + public void fastCharBufferJmh() { + final FastCharBuffer fastCharBuffer = new FastCharBuffer(1024); + for (int i = 0; i < appendCount; i++) { + fastCharBuffer.append(str); + } + } +}