Skip to content

Commit 7515bb4

Browse files
committed
减少一处内存分配,优化性能。
1 parent d198e18 commit 7515bb4

File tree

1 file changed

+30
-56
lines changed

1 file changed

+30
-56
lines changed

Quick.Protocol/QpChannel.cs

Lines changed: 30 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -275,17 +275,6 @@ protected virtual void OnReadError(Exception exception)
275275
Disconnect();
276276
}
277277

278-
//获取空闲的缓存
279-
private static byte[] getFreeBuffer(byte[] usingBuffer, params byte[][] bufferArray)
280-
{
281-
foreach (var buffer in bufferArray)
282-
{
283-
if (usingBuffer != buffer)
284-
return buffer;
285-
}
286-
return null;
287-
}
288-
289278
private async Task writePackageBuffer(Stream stream, QpPackageType packageType, ReadOnlySequence<byte> packageBodyBuffer, Action afterSendHandler)
290279
{
291280
/*
@@ -366,74 +355,59 @@ await writeTask
366355

367356
private static void writePackageTotalLengthToBuffer(byte[] buffer, int offset, int packageTotalLength)
368357
{
369-
//构造包头
370-
var ret = BitConverter.GetBytes(packageTotalLength);
358+
BitConverter.TryWriteBytes(new Span<byte>(buffer, offset, sizeof(int)), packageTotalLength);
371359
//如果是小端字节序,则交换
372360
if (BitConverter.IsLittleEndian)
373-
Array.Reverse(ret);
374-
Array.Copy(ret, 0, buffer, offset, sizeof(int));
361+
Array.Reverse(buffer, offset, sizeof(int));
375362
}
376363

377-
378-
379-
private async Task writePackageAsync(Func<PipeWriter,Task<Tuple<QpPackageType, int>>> getPackagePayloadFunc, Action afterSendHandler)
364+
private async Task writePackageAsync(Func<PipeWriter, Task<Tuple<QpPackageType, int>>> getPackagePayloadFunc, Action afterSendHandler)
380365
{
381366
try
382367
{
383-
Interlocked.Increment(ref PackageSendQueueCount);
368+
if (options.EnableNetstat)
369+
Interlocked.Increment(ref PackageSendQueueCount);
384370
await sendLock.WaitAsync().ConfigureAwait(false);
385371
var stream = QpPackageHandler_Stream;
386372
if (stream == null)
387373
throw new IOException("Connection is disconnected.");
388-
await writePackage(getPackagePayloadFunc, afterSendHandler).ConfigureAwait(false);
389-
}
390-
finally
391-
{
392-
sendLock.Release();
393-
Interlocked.Decrement(ref PackageSendQueueCount);
394-
}
395-
}
396374

397-
private async Task writePackage(Func<PipeWriter,Task<Tuple<QpPackageType, int>>> getPackagePayloadFunc, Action afterSendHandler)
398-
{
399-
var stream = QpPackageHandler_Stream;
400-
if (stream == null)
401-
throw new ArgumentNullException(nameof(QpPackageHandler_Stream));
402-
var ret = await getPackagePayloadFunc(sendPipe.Writer).ConfigureAwait(false);
403-
var packageType = ret.Item1;
404-
var packageBodyLength = ret.Item2;
405-
var packageTotalLength = packageBodyLength + PACKAGE_HEAD_LENGTH;
375+
var ret = await getPackagePayloadFunc(sendPipe.Writer).ConfigureAwait(false);
376+
var packageType = ret.Item1;
377+
var packageBodyLength = ret.Item2;
378+
var packageTotalLength = packageBodyLength + PACKAGE_HEAD_LENGTH;
406379

407-
if (packageTotalLength < PACKAGE_HEAD_LENGTH)
408-
throw new IOException($"包大小[{packageTotalLength}]小于包头长度[{PACKAGE_HEAD_LENGTH}]");
409-
try
410-
{
411-
ReadOnlySequence<byte> packageBuffer = default;
412-
if (packageBodyLength > 0)
380+
if (packageTotalLength < PACKAGE_HEAD_LENGTH)
381+
throw new IOException($"包大小[{packageTotalLength}]小于包头长度[{PACKAGE_HEAD_LENGTH}]");
382+
try
413383
{
414-
var readRet = await sendPipe.Reader.ReadAtLeastAsync(packageBodyLength).ConfigureAwait(false);
415-
packageBuffer = readRet.Buffer;
416-
384+
ReadOnlySequence<byte> packageBuffer = default;
385+
if (packageBodyLength > 0)
386+
{
387+
var readRet = await sendPipe.Reader.ReadAtLeastAsync(packageBodyLength).ConfigureAwait(false);
388+
packageBuffer = readRet.Buffer;
389+
}
417390
await writePackageBuffer(stream,
418391
packageType,
419392
packageBuffer,
420393
afterSendHandler).ConfigureAwait(false);
421-
sendPipe.Reader.AdvanceTo(packageBuffer.End);
394+
if (packageBodyLength > 0)
395+
{
396+
sendPipe.Reader.AdvanceTo(packageBuffer.End);
397+
}
398+
lastSendPackageTime = DateTime.Now;
422399
}
423-
else
400+
catch (Exception ex)
424401
{
425-
await writePackageBuffer(stream,
426-
packageType,
427-
packageBuffer,
428-
afterSendHandler).ConfigureAwait(false);
402+
OnWriteError(ex);
403+
throw;
429404
}
430-
431-
lastSendPackageTime = DateTime.Now;
432405
}
433-
catch (Exception ex)
406+
finally
434407
{
435-
OnWriteError(ex);
436-
throw;
408+
sendLock.Release();
409+
if (options.EnableNetstat)
410+
Interlocked.Decrement(ref PackageSendQueueCount);
437411
}
438412
}
439413

0 commit comments

Comments
 (0)