From a2e113b987291ddb78f23c0af2c4ed6776e2a344 Mon Sep 17 00:00:00 2001 From: Sergey Polovko Date: Sun, 28 Feb 2016 22:09:09 +0300 Subject: [PATCH] Use ByteProcessor.FIND_LF to find end of line Motivation: Each call of ByteBuf.getByte(int) method does boundary checking. This can be eliminated by using ByteBuf.forEachByte(ByteProcessor) method and ByteProcessor.FIND_LF processor. Modifications: Find end of line with ByteProcessor.FIND_LF Result: A little better performance of LineBasedFrameDecoder. --- .../netty/handler/codec/LineBasedFrameDecoder.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/codec/src/main/java/io/netty/handler/codec/LineBasedFrameDecoder.java b/codec/src/main/java/io/netty/handler/codec/LineBasedFrameDecoder.java index aee97d3c50..9b231c766c 100644 --- a/codec/src/main/java/io/netty/handler/codec/LineBasedFrameDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/LineBasedFrameDecoder.java @@ -17,6 +17,7 @@ package io.netty.handler.codec; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; +import io.netty.util.ByteProcessor; import java.util.List; @@ -152,15 +153,10 @@ public class LineBasedFrameDecoder extends ByteToMessageDecoder { * Returns -1 if no end of line was found in the buffer. */ private static int findEndOfLine(final ByteBuf buffer) { - final int n = buffer.writerIndex(); - for (int i = buffer.readerIndex(); i < n; i ++) { - final byte b = buffer.getByte(i); - if (b == '\n') { - return i; - } else if (b == '\r' && i < n - 1 && buffer.getByte(i + 1) == '\n') { - return i; // \r\n - } + int i = buffer.forEachByte(ByteProcessor.FIND_LF); + if (i > 0 && buffer.getByte(i - 1) == '\r') { + i--; } - return -1; // Not found. + return i; } }