Skip to content

Commit 27809b8

Browse files
committed
Use local functions.
Note that we avoid capturing local variables, because this causes the compiler-generated code to allocate a new class to store them. By passing the parameters (and aliasing them with a different parameter name in the local function), we get zero extra allocations.
1 parent 5516807 commit 27809b8

File tree

3 files changed

+52
-71
lines changed

3 files changed

+52
-71
lines changed

src/MySqlConnector/MySqlClient/Results/ResultSet.cs

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -162,42 +162,38 @@ private ValueTask<Row> ScanRowAsync(IOBehavior ioBehavior, Row row, Cancellation
162162
if (BufferState == ResultSetState.HasMoreData || BufferState == ResultSetState.NoMoreData || BufferState == ResultSetState.None)
163163
return new ValueTask<Row>((Row)null);
164164

165-
var payloadTask = Session.ReceiveReplyAsync(ioBehavior, cancellationToken);
166-
return payloadTask.IsCompletedSuccessfully
167-
? new ValueTask<Row>(ScanRowAsyncRemainder(row, payloadTask.Result))
168-
: new ValueTask<Row>(ScanRowAsyncAwaited(row, payloadTask.AsTask()));
169-
}
165+
var payloadValueTask = Session.ReceiveReplyAsync(ioBehavior, cancellationToken);
166+
return payloadValueTask.IsCompletedSuccessfully
167+
? new ValueTask<Row>(ScanRowAsyncRemainder(payloadValueTask.Result))
168+
: new ValueTask<Row>(ScanRowAsyncAwaited(payloadValueTask.AsTask()));
170169

171-
private async Task<Row> ScanRowAsyncAwaited(Row row, Task<PayloadData> payloadTask)
172-
{
173-
var payload = await payloadTask.ConfigureAwait(false);
174-
return ScanRowAsyncRemainder(row, payload);
175-
}
170+
async Task<Row> ScanRowAsyncAwaited(Task<PayloadData> payloadTask) => ScanRowAsyncRemainder(await payloadTask.ConfigureAwait(false));
176171

177-
private Row ScanRowAsyncRemainder(Row row, PayloadData payload)
178-
{
179-
if (EofPayload.IsEof(payload))
172+
Row ScanRowAsyncRemainder(PayloadData payload)
180173
{
181-
var eof = EofPayload.Create(payload);
182-
BufferState = (eof.ServerStatus & ServerStatus.MoreResultsExist) == 0 ? ResultSetState.NoMoreData : ResultSetState.HasMoreData;
183-
m_rowBuffered = null;
184-
return null;
185-
}
174+
if (EofPayload.IsEof(payload))
175+
{
176+
var eof = EofPayload.Create(payload);
177+
BufferState = (eof.ServerStatus & ServerStatus.MoreResultsExist) == 0 ? ResultSetState.NoMoreData : ResultSetState.HasMoreData;
178+
m_rowBuffered = null;
179+
return null;
180+
}
186181

187-
var reader = new ByteArrayReader(payload.ArraySegment);
188-
for (var column = 0; column < m_dataOffsets.Length; column++)
189-
{
190-
var length = checked((int) ReadFieldLength(reader));
191-
m_dataLengths[column] = length == -1 ? 0 : length;
192-
m_dataOffsets[column] = length == -1 ? -1 : reader.Offset;
193-
reader.Offset += m_dataLengths[column];
194-
}
182+
var reader = new ByteArrayReader(payload.ArraySegment);
183+
for (var column = 0; column < m_dataOffsets.Length; column++)
184+
{
185+
var length = checked((int) ReadFieldLength(reader));
186+
m_dataLengths[column] = length == -1 ? 0 : length;
187+
m_dataOffsets[column] = length == -1 ? -1 : reader.Offset;
188+
reader.Offset += m_dataLengths[column];
189+
}
195190

196-
if (row == null)
197-
row = new Row(this);
198-
row.SetData(m_dataLengths, m_dataOffsets, payload.ArraySegment.Array);
199-
m_rowBuffered = row;
200-
return row;
191+
if (row == null)
192+
row = new Row(this);
193+
row.SetData(m_dataLengths, m_dataOffsets, payload.ArraySegment.Array);
194+
m_rowBuffered = row;
195+
return row;
196+
}
201197
}
202198

203199
private static long ReadFieldLength(ByteArrayReader reader)

src/MySqlConnector/Protocol/Serialization/SocketByteHandler.cs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ public SocketByteHandler(Socket socket)
1515

1616
public ValueTask<int> ReadBytesAsync(ArraySegment<byte> buffer, IOBehavior ioBehavior)
1717
{
18-
if (ioBehavior == IOBehavior.Asynchronous)
19-
{
20-
return new ValueTask<int>(DoReadBytesAsync(buffer));
21-
}
22-
else
18+
return (ioBehavior == IOBehavior.Asynchronous) ?
19+
new ValueTask<int>(DoReadBytesAsync(buffer)) :
20+
new ValueTask<int>(m_socket.Receive(buffer.Array, buffer.Offset, buffer.Count, SocketFlags.None));
21+
22+
async Task<int> DoReadBytesAsync(ArraySegment<byte> buffer_)
2323
{
24-
var bytesRead = m_socket.Receive(buffer.Array, buffer.Offset, buffer.Count, SocketFlags.None);
25-
return new ValueTask<int>(bytesRead);
24+
m_socketAwaitable.EventArgs.SetBuffer(buffer_.Array, buffer_.Offset, buffer_.Count);
25+
await m_socket.ReceiveAsync(m_socketAwaitable);
26+
return m_socketAwaitable.EventArgs.BytesTransferred;
2627
}
2728
}
2829

@@ -37,20 +38,13 @@ public ValueTask<int> WriteBytesAsync(ArraySegment<byte> data, IOBehavior ioBeha
3738
m_socket.Send(data.Array, data.Offset, data.Count, SocketFlags.None);
3839
return default(ValueTask<int>);
3940
}
40-
}
4141

42-
private async Task<int> DoReadBytesAsync(ArraySegment<byte> buffer)
43-
{
44-
m_socketAwaitable.EventArgs.SetBuffer(buffer.Array, buffer.Offset, buffer.Count);
45-
await m_socket.ReceiveAsync(m_socketAwaitable);
46-
return m_socketAwaitable.EventArgs.BytesTransferred;
47-
}
48-
49-
private async Task<int> DoWriteBytesAsync(ArraySegment<byte> payload)
50-
{
51-
m_socketAwaitable.EventArgs.SetBuffer(payload.Array, payload.Offset, payload.Count);
52-
await m_socket.SendAsync(m_socketAwaitable);
53-
return 0;
42+
async Task<int> DoWriteBytesAsync(ArraySegment<byte> data_)
43+
{
44+
m_socketAwaitable.EventArgs.SetBuffer(data_.Array, data_.Offset, data_.Count);
45+
await m_socket.SendAsync(m_socketAwaitable);
46+
return 0;
47+
}
5448
}
5549

5650
readonly Socket m_socket;

src/MySqlConnector/Protocol/Serialization/StreamByteHandler.cs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,12 @@ public StreamByteHandler(Stream stream)
1313

1414
public ValueTask<int> ReadBytesAsync(ArraySegment<byte> buffer, IOBehavior ioBehavior)
1515
{
16-
if (ioBehavior == IOBehavior.Asynchronous)
17-
{
18-
return new ValueTask<int>(DoReadBytesAsync(buffer));
19-
}
20-
else
21-
{
22-
var bytesRead = m_stream.Read(buffer.Array, buffer.Offset, buffer.Count);
23-
return new ValueTask<int>(bytesRead);
24-
}
16+
return (ioBehavior == IOBehavior.Asynchronous) ?
17+
new ValueTask<int>(DoReadBytesAsync(buffer)) :
18+
new ValueTask<int>(m_stream.Read(buffer.Array, buffer.Offset, buffer.Count));
19+
20+
async Task<int> DoReadBytesAsync(ArraySegment<byte> buffer_) =>
21+
await m_stream.ReadAsync(buffer_.Array, buffer_.Offset, buffer_.Count).ConfigureAwait(false);
2522
}
2623

2724
public ValueTask<int> WriteBytesAsync(ArraySegment<byte> data, IOBehavior ioBehavior)
@@ -35,18 +32,12 @@ public ValueTask<int> WriteBytesAsync(ArraySegment<byte> data, IOBehavior ioBeha
3532
m_stream.Write(data.Array, data.Offset, data.Count);
3633
return default(ValueTask<int>);
3734
}
38-
}
39-
40-
private async Task<int> DoReadBytesAsync(ArraySegment<byte> buffer)
41-
{
42-
var bytesRead = await m_stream.ReadAsync(buffer.Array, buffer.Offset, buffer.Count).ConfigureAwait(false);
43-
return bytesRead;
44-
}
4535

46-
private async Task<int> DoWriteBytesAsync(ArraySegment<byte> payload)
47-
{
48-
await m_stream.WriteAsync(payload.Array, payload.Offset, payload.Count).ConfigureAwait(false);
49-
return 0;
36+
async Task<int> DoWriteBytesAsync(ArraySegment<byte> data_)
37+
{
38+
await m_stream.WriteAsync(data_.Array, data_.Offset, data_.Count).ConfigureAwait(false);
39+
return 0;
40+
}
5041
}
5142

5243
readonly Stream m_stream;

0 commit comments

Comments
 (0)