ruby - 阅读套接字速度理论

标签 ruby sockets

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

只是为该协议(protocol)解析消息的方式的基础。读取套接字缓冲区直到 \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 的额外步骤。

哪个会更快?

最佳答案

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

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

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

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

关于ruby - 阅读套接字速度理论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17388819/

相关文章:

arrays - 在 Ruby 中转换对象数组

ruby-on-rails - 如何在 Grape 中格式化参数中的日期时间

ruby - Ruby 中 call/cc 和 "ensure"的语义

c++ - C++ 中的 SIGPIPE 确定哪个 TCP 套接字已断开连接

java - 在线程中调用地理编码器构造函数时,连接崩溃

ruby - Rails 3 多态关联,具有多个内容项的用户模型?

ruby - 在 Capybara Webkit 测试中将 Ctrl-S 发送到浏览器

java - 使用 Java 在服务器应用程序和 Matlab 客户端之间进行套接字通信

sockets - redis 服务器套接字在哪里创建?

python - 为什么不能 select.select() 捕获关闭的套接字错误?