Cleanup, simple perf.

This commit is contained in:
Chris Ross 2014-03-08 10:35:56 -08:00
parent 9ba9f666bb
commit 30ca12933e
5 changed files with 35 additions and 35 deletions

View File

@ -154,15 +154,8 @@ namespace Microsoft.Net.WebSockets
} }
// Handle fragmentation, remember the first frame type // Handle fragmentation, remember the first frame type
int opCode = Constants.OpCodes.ContinuationFrame; int opCode = _frameInProgress.OpCode;
if (_frameInProgress.OpCode == Constants.OpCodes.BinaryFrame if (opCode == Constants.OpCodes.ContinuationFrame)
|| _frameInProgress.OpCode == Constants.OpCodes.TextFrame
|| _frameInProgress.OpCode == Constants.OpCodes.CloseFrame)
{
opCode = _frameInProgress.OpCode;
_firstDataOpCode = opCode;
}
else if (_frameInProgress.OpCode == Constants.OpCodes.ContinuationFrame)
{ {
if (!_firstDataOpCode.HasValue) if (!_firstDataOpCode.HasValue)
{ {
@ -170,39 +163,34 @@ namespace Microsoft.Net.WebSockets
} }
opCode = _firstDataOpCode.Value; opCode = _firstDataOpCode.Value;
} }
else
{
_firstDataOpCode = opCode;
}
if (opCode == Constants.OpCodes.CloseFrame) if (opCode == Constants.OpCodes.CloseFrame)
{ {
return await ProcessCloseFrameAsync(cancellationToken); return await ProcessCloseFrameAsync(cancellationToken);
} }
WebSocketReceiveResult result;
WebSocketMessageType messageType = Utilities.GetMessageType(opCode);
if (_frameBytesRemaining == 0)
{
// End of an empty frame?
result = new WebSocketReceiveResult(0, messageType, _frameInProgress.Fin);
if (_frameInProgress.Fin)
{
_firstDataOpCode = null;
}
_frameInProgress = null;
return result;
}
// Make sure there's at least some data in the buffer // Make sure there's at least some data in the buffer
await EnsureDataAvailableOrReadAsync(1, cancellationToken); int bytesToBuffer = (int)Math.Min((long)_receiveBuffer.Length, _frameBytesRemaining);
await EnsureDataAvailableOrReadAsync(bytesToBuffer, cancellationToken);
// Copy buffered data to the users buffer // Copy buffered data to the users buffer
int bytesToRead = (int)Math.Min((long)buffer.Count, _frameBytesRemaining); int bytesToRead = (int)Math.Min((long)buffer.Count, _frameBytesRemaining);
int bytesToCopy = Math.Min(bytesToRead, _receiveBufferBytes); int bytesToCopy = Math.Min(bytesToRead, _receiveBufferBytes);
Array.Copy(_receiveBuffer, _receiveBufferOffset, buffer.Array, buffer.Offset, bytesToCopy); Array.Copy(_receiveBuffer, _receiveBufferOffset, buffer.Array, buffer.Offset, bytesToCopy);
if (_unmaskInput) if (_unmaskInput)
{ {
// TODO: mask alignment may be off between reads. // TODO: mask alignment may be off between reads.
// _frameInProgress.Masked == _unmaskInput already verified // _frameInProgress.Masked == _unmaskInput already verified
Utilities.MaskInPlace(_frameInProgress.MaskKey, new ArraySegment<byte>(buffer.Array, buffer.Offset, bytesToCopy)); Utilities.MaskInPlace(_frameInProgress.MaskKey, new ArraySegment<byte>(buffer.Array, buffer.Offset, bytesToCopy));
} }
WebSocketReceiveResult result;
WebSocketMessageType messageType = Utilities.GetMessageType(opCode);
if (bytesToCopy == _frameBytesRemaining) if (bytesToCopy == _frameBytesRemaining)
{ {
result = new WebSocketReceiveResult(bytesToCopy, messageType, _frameInProgress.Fin); result = new WebSocketReceiveResult(bytesToCopy, messageType, _frameInProgress.Fin);
@ -216,6 +204,7 @@ namespace Microsoft.Net.WebSockets
{ {
result = new WebSocketReceiveResult(bytesToCopy, messageType, false); result = new WebSocketReceiveResult(bytesToCopy, messageType, false);
} }
_frameBytesRemaining -= bytesToCopy; _frameBytesRemaining -= bytesToCopy;
_receiveBufferBytes -= bytesToCopy; _receiveBufferBytes -= bytesToCopy;
_receiveBufferOffset += bytesToCopy; _receiveBufferOffset += bytesToCopy;
@ -370,7 +359,7 @@ namespace Microsoft.Net.WebSockets
if (State == WebSocketState.CloseSent) if (State == WebSocketState.CloseSent)
{ {
// Do a receiving drain // Do a receiving drain
byte[] data = new byte[1024]; byte[] data = new byte[_receiveBuffer.Length];
WebSocketReceiveResult result; WebSocketReceiveResult result;
do do
{ {

View File

@ -33,10 +33,11 @@ namespace Microsoft.Net.WebSockets
}; };
int maskOffset = 0; int maskOffset = 0;
for (int i = data.Offset; i < data.Offset + data.Count; i++) int end = data.Offset + data.Count;
for (int i = data.Offset; i < end; i++)
{ {
data.Array[i] = (byte)(data.Array[i] ^ maskBytes[maskOffset]); data.Array[i] ^= maskBytes[maskOffset];
maskOffset = (maskOffset + 1) % 4; maskOffset = (maskOffset + 1) & 0x3; // fast % 4;
} }
} }

View File

@ -24,7 +24,7 @@ namespace Microsoft.Net.WebSockets.Client
public WebSocketClient() public WebSocketClient()
{ {
ReceiveBufferSize = 1024; ReceiveBufferSize = 1024 * 64;
} }
public int ReceiveBufferSize public int ReceiveBufferSize

View File

@ -22,13 +22,23 @@ namespace TestClient
{ {
WebSocketClient client = new WebSocketClient(); WebSocketClient client = new WebSocketClient();
WebSocket socket = await client.ConnectAsync(new Uri("ws://chrross-togo:12345/"), CancellationToken.None); WebSocket socket = await client.ConnectAsync(new Uri("ws://chrross-togo:12345/"), CancellationToken.None);
byte[] data = Encoding.UTF8.GetBytes("Hello World"); byte[] data = Encoding.UTF8.GetBytes(
// TODO: Hangs after 10 seconds
// "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World"
// "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, "
// "Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, "
"Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, Hello World, "
);
while (true) while (true)
{ {
await socket.SendAsync(new ArraySegment<byte>(data), WebSocketMessageType.Text, true, CancellationToken.None); await socket.SendAsync(new ArraySegment<byte>(data), WebSocketMessageType.Text, true, CancellationToken.None);
WebSocketReceiveResult result = await socket.ReceiveAsync(new ArraySegment<byte>(data), CancellationToken.None); WebSocketReceiveResult result;
Console.WriteLine(result.MessageType + ", " + result.Count + ", " + result.EndOfMessage); do
Console.WriteLine(Encoding.UTF8.GetString(data, 0, result.Count)); {
result = await socket.ReceiveAsync(new ArraySegment<byte>(data), CancellationToken.None);
// Console.WriteLine("Received: " + result.MessageType + ", " + result.Count + ", " + result.EndOfMessage);
} while (!result.EndOfMessage);
// Console.WriteLine(Encoding.UTF8.GetString(data, 0, result.Count));
} }
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None); await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
} }

View File

@ -41,7 +41,7 @@ namespace TestServer
while (received.MessageType != WebSocketMessageType.Close) while (received.MessageType != WebSocketMessageType.Close)
{ {
Console.WriteLine("Echo"); // Console.WriteLine("Echo, " + received.Count + ", " + received.MessageType + ", " + received.EndOfMessage);
// Echo anything we receive // Echo anything we receive
await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, received.Count), received.MessageType, received.EndOfMessage, CancellationToken.None); await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, received.Count), received.MessageType, received.EndOfMessage, CancellationToken.None);