From d371c1498caf785c9eb619aba71c1c56e1a4ba8e Mon Sep 17 00:00:00 2001 From: Sergey Tselovalnikov Date: Mon, 10 Feb 2020 18:42:39 +1100 Subject: [PATCH 1/2] Improve performance of small websocket messages Signed-off-by: Sergey Tselovalnikov --- .../common/message/SimpleBinaryMessage.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java index e903a503c18..1a4a02ad7a0 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java @@ -23,20 +23,22 @@ import java.io.IOException; import java.nio.ByteBuffer; import org.eclipse.jetty.util.BufferUtil; +import org.eclipse.jetty.util.ByteArrayOutputStream2; import org.eclipse.jetty.websocket.common.events.EventDriver; public class SimpleBinaryMessage implements MessageAppender { + private static final ByteArrayOutputStream2 EMPTY_BUF = new ByteArrayOutputStream2(0); private static final int BUFFER_SIZE = 65535; private final EventDriver onEvent; - protected final ByteArrayOutputStream out; + protected ByteArrayOutputStream2 out; private int size; protected boolean finished; public SimpleBinaryMessage(EventDriver onEvent) { this.onEvent = onEvent; - this.out = new ByteArrayOutputStream(BUFFER_SIZE); + this.out = EMPTY_BUF; finished = false; } @@ -57,6 +59,8 @@ public class SimpleBinaryMessage implements MessageAppender onEvent.getPolicy().assertValidBinaryMessageSize(size + payload.remaining()); size += payload.remaining(); + if (out == EMPTY_BUF) + out = isLast ? new ByteArrayOutputStream2(size) : new ByteArrayOutputStream2(BUFFER_SIZE); BufferUtil.writeTo(payload, out); } @@ -64,7 +68,11 @@ public class SimpleBinaryMessage implements MessageAppender public void messageComplete() { finished = true; - byte[] data = out.toByteArray(); + byte[] data; + if (out.getCount() == out.getBuf().length) + data = out.getBuf(); + else + data = out.toByteArray(); onEvent.onBinaryMessage(data); } } From 66f4bda2eaac89d8b6696937de25aa3ce8c50505 Mon Sep 17 00:00:00 2001 From: Sergey Tselovalnikov Date: Mon, 10 Feb 2020 21:00:22 +1100 Subject: [PATCH 2/2] comments Signed-off-by: Sergey Tselovalnikov --- .../websocket/jsr356/messages/BinaryWholeMessage.java | 2 +- .../websocket/common/message/SimpleBinaryMessage.java | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/BinaryWholeMessage.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/BinaryWholeMessage.java index 770a0657fdb..e1bc52d0180 100644 --- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/BinaryWholeMessage.java +++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/messages/BinaryWholeMessage.java @@ -51,7 +51,7 @@ public class BinaryWholeMessage extends SimpleBinaryMessage { super.finished = true; - byte[] data = out.toByteArray(); + byte[] data = (out == null) ? new byte[]{} : out.toByteArray(); DecoderFactory.Wrapper decoder = msgWrapper.getDecoder(); Decoder.Binary binaryDecoder = (Binary)decoder.getDecoder(); diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java index 1a4a02ad7a0..ee3ca31b391 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/message/SimpleBinaryMessage.java @@ -18,7 +18,6 @@ package org.eclipse.jetty.websocket.common.message; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; @@ -28,7 +27,6 @@ import org.eclipse.jetty.websocket.common.events.EventDriver; public class SimpleBinaryMessage implements MessageAppender { - private static final ByteArrayOutputStream2 EMPTY_BUF = new ByteArrayOutputStream2(0); private static final int BUFFER_SIZE = 65535; private final EventDriver onEvent; protected ByteArrayOutputStream2 out; @@ -38,7 +36,6 @@ public class SimpleBinaryMessage implements MessageAppender public SimpleBinaryMessage(EventDriver onEvent) { this.onEvent = onEvent; - this.out = EMPTY_BUF; finished = false; } @@ -59,7 +56,7 @@ public class SimpleBinaryMessage implements MessageAppender onEvent.getPolicy().assertValidBinaryMessageSize(size + payload.remaining()); size += payload.remaining(); - if (out == EMPTY_BUF) + if (out == null) out = isLast ? new ByteArrayOutputStream2(size) : new ByteArrayOutputStream2(BUFFER_SIZE); BufferUtil.writeTo(payload, out); } @@ -69,7 +66,9 @@ public class SimpleBinaryMessage implements MessageAppender { finished = true; byte[] data; - if (out.getCount() == out.getBuf().length) + if (out == null) + data = new byte[]{}; + else if (out.getCount() == out.getBuf().length) data = out.getBuf(); else data = out.toByteArray();