none
C# 中对于频繁读写byte[]有没有提高性能的办法? RRS feed

  • 问题

  • 在网络应用中,我会创建一个个的封包,这个包的包头为固定长度,包含标识,校验,实际数据长度,包头后面为实际数据。

    那么有没有提高性能的办法?

    2020年5月19日 10:07

全部回复

  • Hi jinli,

    你所说的创建封包有没有具体的代码,如果有的话,提供一下相关代码。

    关于读写bye数组提高性能的方法,我找到下面有个类似的链接可能会帮助到你。

    Quickest way (performance-wise) to turn a string into a byte[] array in C# using the ASCII character encoding

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年5月20日 8:21
    版主
  •         private const int PackageHeaderSize = 45;

            public void ReadStream(Stream stream, CancellationToken token)
            {
                _stream = stream;
                if (_stream == null) return;

                Task.Factory.StartNew(() =>
                {
                    while (!token.IsCancellationRequested && _stream.CanRead)
                    {
                        var headerBuffer = ArrayPool<byte>.Shared.Rent(PackageHeaderSize);
                        var readLen = _stream.Read(headerBuffer, 0, headerBuffer.Length);
                        if (readLen == 0)
                        {
                            Debug.WriteLine("client closed");
                        }
                        else if (readLen != PackageHeaderSize)
                        {
                            Debug.WriteLine("client date error");
                        }
                        else
                        {
                            var pkgHeader = BytesToPackage(headerBuffer);
                            ArrayPool<byte>.Shared.Return(headerBuffer,true);
                            var dataBuffer = ArrayPool<byte>.Shared.Rent(pkgHeader.DataLength);
                            ProcessData(pkgHeader, dataBuffer);
                        }
                    }

                }, token);
            }

    以上是部分逻辑代码。我不是很清楚 ArrayPool<byte>.Shared 是否能作到

    内存的重复利用以及性能优化,减少碎片。

    • 已编辑 jinli.zh 2020年5月21日 9:44 补充
    2020年5月21日 9:35