From cac51ab8d68412a3db6b6c3310e5ed0f842865c2 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Wed, 2 Sep 2015 11:52:01 +0200 Subject: [PATCH] Optimize ByteBufUtil.writeUsAscii(...) when AsciiString is used. Motivation: When AsciiString is used we can optimize the write operation done by ByteBufUtil.writeUsAscii(...) Modifications: Sepcial handle AsciiString. Result: Faster writing of AsciiString. --- .../src/main/java/io/netty/buffer/ByteBufUtil.java | 6 +++++- .../test/java/io/netty/buffer/ByteBufUtilTest.java | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java b/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java index c56f322b7f..cd32a0fc90 100644 --- a/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java +++ b/buffer/src/main/java/io/netty/buffer/ByteBufUtil.java @@ -17,6 +17,7 @@ package io.netty.buffer; import static io.netty.util.internal.ObjectUtil.checkNotNull; +import io.netty.util.AsciiString; import io.netty.util.ByteProcessor; import io.netty.util.ByteString; import io.netty.util.CharsetUtil; @@ -498,7 +499,10 @@ public final class ByteBufUtil { // ASCII uses 1 byte per char final int len = seq.length(); buf.ensureWritable(len); - if (buf instanceof AbstractByteBuf) { + if (seq instanceof AsciiString) { + AsciiString asciiString = (AsciiString) seq; + buf.writeBytes(asciiString.array(), asciiString.arrayOffset(), asciiString.length()); + } else if (buf instanceof AbstractByteBuf) { // Fast-Path AbstractByteBuf buffer = (AbstractByteBuf) buf; int writerIndex = buffer.writerIndex; diff --git a/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java b/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java index fcdf987317..9507d815b4 100644 --- a/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java +++ b/buffer/src/test/java/io/netty/buffer/ByteBufUtilTest.java @@ -17,6 +17,8 @@ package io.netty.buffer; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; + +import io.netty.util.AsciiString; import io.netty.util.CharsetUtil; import io.netty.util.ReferenceCountUtil; @@ -105,4 +107,15 @@ public class ByteBufUtilTest { Assert.assertEquals(buf, buf2); } + + @Test + public void testWriteUsAsciiString() { + AsciiString usAscii = new AsciiString("NettyRocks"); + ByteBuf buf = ReferenceCountUtil.releaseLater(Unpooled.buffer(16)); + buf.writeBytes(usAscii.toString().getBytes(CharsetUtil.US_ASCII)); + ByteBuf buf2 = ReferenceCountUtil.releaseLater(Unpooled.buffer(16)); + ByteBufUtil.writeAscii(buf2, usAscii); + + Assert.assertEquals(buf, buf2); + } }