You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/09/11 16:13:47 UTC

svn commit: r1521860 - in /tomcat/tc7.0.x/trunk: ./ java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java

Author: markt
Date: Wed Sep 11 14:13:47 2013
New Revision: 1521860

URL: http://svn.apache.org/r1521860
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/tc7.0.x/trunk/   (props changed)
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1521831

Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java?rev=1521860&r1=1521859&r2=1521860&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/WsRemoteEndpointImplBase.java Wed Sep 11 14:13:47 2013
@@ -715,10 +715,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) {
@@ -726,7 +738,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-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org