1

我只是想问一些我认为合乎逻辑的问题,但我似乎无法在互联网上找到明确的证据来支持它。

只是为该协议解析消息的方式的基础。读取套接字缓冲区,直到\n满足,然后将消息分派给消息处理程序。

现在考虑到这一点,这将更有效率。

Method A)
1) read 1 byte from from socket buffer
2) check to see if byte is a newline
3) if it is not append to the array if it is send array to message handler and clear array
4) repeat until connection closed

或者

Method B)
1) read multi bytes from socket buffer as one chunk
2) search the array for a newline
3) if newline is found, send the beginning of the array up to the newline to message handler, then remove it from the array shifting remaining data down.
4) repeat until connection closed

如果语言在这方面发挥作用,它将在 ruby​​ 中使用其字符串函数进行搜索等。

我认为方法 B 会更快,因为它正在读取更多数据,但是字符串搜索再次提供了方法 A 的额外步骤。

哪个会更快?

4

1 回答 1

1

在 Ruby 中,方法 B可能更快,但这是一个语言问题,而不是关于处理套接字的一般说明。在这两种情况下,套接字缓冲区和处理该缓冲区的低级例程都在为应用程序提供不同层的 I/O 性能。

如果应用程序跟上来自套接字的数据,那么您可能会受到 I/O 限制,并且不会注意到方法之间的任何差异。

但是,在 Ruby 中,代码逐项列出单个数字/字节/字符的方法效率不高,因为它们会生成大量 Ruby 对象,并且每个对象的开销都很小。这使得纯 Ruby 在逐个字符解析方面相对较慢,如果您希望您的应用程序运行良好,您应该对字符串使用批量方法,其中逐个字符的过程发生在更好优化的内部方法中。

这是否会影响完成时间取决于套接字中数据输入的速度。除非您查看用户 CPU 时间,否则您可能无法测量差异。我应该补充一点,我正在跳过存在 CPU 时间争用的更复杂的场景,例如在单核处理器上。

于 2013-06-30T09:26:57.427 回答