Author: markt Date: Wed Sep 11 13:43:02 2013 New Revision: 1521831 URL: http://svn.apache.org/r1521831 Log: Performance tuning after analysis with Yourkit Use bulk write for the payload rather than a loop when there is no mask to apply (i.e. on the client side).
Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java Modified: tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java?rev=1521831&r1=1521830&r2=1521831&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java (original) +++ tomcat/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java Wed Sep 11 13:43:02 2013 @@ -680,10 +680,22 @@ public abstract class WsRemoteEndpointIm } // Write the payload - while (payload.hasRemaining() && outputBuffer.hasRemaining()) { - if (mask == null) { - outputBuffer.put(payload.get()); - } else { + int payloadLeft = payload.remaining(); + int payloadLimit = payload.limit(); + int outputSpace = outputBuffer.remaining(); + int toWrite = payloadLeft; + + if (payloadLeft > outputSpace) { + toWrite = outputSpace; + // Temporarily reduce the limit + payload.limit(payload.position() + toWrite); + } + + if (mask == null) { + // Use a bulk copy + outputBuffer.put(payload); + } else { + for (int i = 0; i < toWrite; i++) { outputBuffer.put( (byte) (payload.get() ^ (mask[maskIndex++] & 0xFF))); if (maskIndex > 3) { @@ -691,7 +703,10 @@ public abstract class WsRemoteEndpointIm } } } - if (payload.hasRemaining()) { + + if (payloadLeft > outputSpace) { + // Restore the original limit + payload.limit(payloadLimit); // Still more headers to write, need to flush outputBuffer.flip(); endpoint.doWrite(this, outputBuffer); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org