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: [email protected]
For additional commands, e-mail: [email protected]