2010-12-03 112 views
2

我正在使用TcpClient与以“\ n”分隔字符串形式发送信息的服务器进行通信。数据流量非常高,一旦通道设置完成,流将始终有信息读取。消息可以是可变大小的。。 ReadLine()与Read ByteArray读取哪个更好?

我现在的问题是,使用ReadLine()方法从流中读取消息是否更好,因为它们已经被“\ n”分隔,或者建议读取一些固定大小的byteArray并选择他们使用拆分(“\ n”)或类似的消息字符串? (是的,我知道有些情况下字节数组只能得到部分消息,而我们也必须为此实现逻辑。)

这里需要考虑的一点是:

  • 表现。

  • 数据丢失。如果客户的数据读取速度不够快,会不会有一些数据丢失?

  • 多线程设置。如果这个设置必须在多线程环境中实现,每个线程都有一个单独的通信通道,但是会在客户端共享相同的资源。

回答

2

如果性能是您的主要担忧,那么我宁愿Read高于ReadLine方法。 I/O是程序可以做的较慢的事情之一,因此您希望通过预先读取尽可能多的数据来尽量减少I/O例程的时间。

如果您使用的是TCP,那么数据丢失并不是真正的问题。 TCP协议保证交付并将处理导致丢包的拥塞问题。

对于问题的线程部分,我们需要更多的信息。什么资源是共享的,他们共享TcpClient's等...

+0

感谢您的帮助。是的,性能是一个主要问题,但是您认为,读入byteArray,转换为字符串,检查部分消息并拆分消息不会造成额外开销,并且性能仍然会更好? – 2010-12-03 02:40:53

+0

使用共享资源时,问题基本上是客户机上的内存空间。 – 2010-12-03 02:43:00

+0

@Danish,有点字符串操作几乎肯定比多个IO调用更快。 – JaredPar 2010-12-03 02:46:18

0

我会说去与缓冲池,并做手动读取(读取()在套接字上),如果你需要大量的性能。汇集缓冲区将避免产生垃圾,因为我相信ReadLine()会产生一些垃圾。

由于您使用的是TCP,所以数据丢失不应该成为问题。

在多线程设置中,您必须是特定的,但总的来说,资源共享很麻烦,因为它可能会产生数据竞争。

0

为什么不使用BufferedStream,以确保您正在阅读的最佳出流:

var req = (HttpWebRequest)WebRequest.Create("http://www.stackoverflow.com"); 
using(var resp = (HttpWebResponse)req.GetResponse()) 
using(var stream = resp.GetResponseStream()) 
using(var bufferedStream = new BufferedStream(stream)) 
using(var streamReader = new StreamReader(bufferedStream)) 
{ 
    while(!streamReader.EndOfStream) 
    { 
     string currentLine = streamReader.ReadLine(); 
     Console.WriteLine(currentLine); 
    } 
} 

当然,如果你正在寻找扩大,会异步将是一种必然。因此,ReadLine是不存在的问题,你回到字节数组操作。

0

我会读入一个字节数组....只有缺点:大小有限。您需要知道某个字节数量的限制,或者有时候手动将字节数组转换为字节集合,然后将集合转换回字节数组,然后使用bitConverter将其转换为字符串,最后将其分割为真正的消息:p

您将有大量的开销将数组刷入集合中......但是,冲入字符串将需要更多的资源,因为字节必须被解码,因为您将它们刷新到字符串中......所以这取决于您...您可以选择字符串的简单性或字节的效率,无论哪种方式不会是对方的严重性能提升,但我会亲自去字节集合以避免隐式字节转换。

重要提示:这来自以前的TCP套接字使用(Quake RCON的东西)的个人经验,而不是任何书或任何东西:)纠正我,如果我错了请。