我只是想问一些我认为合乎逻辑的问题,但我似乎无法在互联网上找到明确的证据支持它。
只是解析此协议的消息的方法的基础。读取套接字缓冲区,直到满足\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的额外步骤。
哪个会更快?
答案 0 :(得分:1)
在Ruby方法中,B 可能更快,但这是一个语言问题,而不是关于处理套接字的一般声明。在这两种情况下,套接字缓冲区和处理它的低级例程都在与应用程序不同的层中提供I / O性能。
如果应用程序与套接字中的数据保持一致,那么您可能受到I / O限制,并且没有注意到方法之间的任何差异。
然而,在Ruby中,代码逐项列出单个数字/字节/字符的方法效率不高,因为它们生成大量的Ruby对象,并且每个方法都有很小的开销。这使得纯Ruby在逐个字符解析时相对较慢,如果您希望应用程序运行良好,则应该对字符串使用批量方法,其中逐个字符的过程在更好的内部方法中发生。
这是否会影响完成时间取决于套接字中输入数据的速度。除非您查看用户CPU时间,否则您可能无法衡量差异。我应该补充说,我正在跳过存在争用CPU时间的更复杂的场景,例如在单核处理器上。