繁体   English   中英

为什么使用Write(Byte [])而不是使用foreach和Write(Byte),使用BinaryWriter发送数据的速度要快得多?

[英]Why is sending data with BinaryWriter so much faster using Write(Byte[]) instead of using foreach and Write(Byte)?

我正在使用C#32feet (版本3.5)通过蓝牙(SPP)将250字节的块发送到我正在为其编写固件的嵌入式设备。

我正在使用以下代码设置我的连接:

var client = new BluetoothClient();
client.Encrypt = true;
client.Connect(bluetoothAddress, ServiceClassId);
NetworkStream stream = client.GetStream();
var writer = new BinaryWriter(stream);

我在吞吐量非常低的情况下遇到了一些问题,每个块需要大约100毫秒才能使用以下代码进行传输:

public void SendData(List<byte> data)
{
    try
    {
        foreach (byte d in data)
        {
            writer.Write(d);
        }
        writer.Flush();
    }
    catch (Exception)
    {
        // The connection was lost
        ConnectionCleanup();
    }
}

将上面的代码块更改为下面的代码后,每个块在4 ms内发送。

try
{
    writer.Write(data.ToArray());
    writer.Flush();
}
catch (Exception)
{
    // The connection was lost
    ConnectionCleanup();
}

我很难理解这种“简单”的代码更改如何对吞吐量产生如此大的影响。 谁能帮我解释一下发生了什么? 我想这与32feet的底层机制有关?

我来回改变了代码,结果每次都是一样的。 传输的数据也是一样的。

我还直接从Windows连接到设备,然后在Realterm中打开COM端口以发送相同的数据。 在这种情况下,我获得与使用writer.Write(data.ToArray())类似的吞吐量。

我正在使用Microsoft Bluetooth Stack

看一下BinaryWriter参考源Write(byte)调用底层流的WriteByte(byte) ,而Write(byte[])调用Write(byte[], int, int) 进一步看,我们看到NetworkStream没有覆盖虚方法WriteByte,因此使用了基本实现

// Writes one byte from the stream by calling Write(byte[], int, int).
// This implementation does not perform well because it allocates a new
// byte[] each time you call it, and should be overridden by any 
// subclass that maintains an internal buffer.  Then, it can help perf
// significantly for people who are writing one byte at a time.
public virtual void WriteByte(byte value)
{
    byte[] oneByteArray = new byte[1];
    oneByteArray[0] = value;
    Write(oneByteArray, 0, 1);
}

此外, NetworkStream没有内部缓冲区,它只是将Write调用传递给底层Socket 您在第一种情况下进行250次网络呼叫,在第二种情况下进行1次,因此性能差异的原因应该是显而易见的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM