Chr*_*ris 0 optimization network-programming tcp ruby-on-rails
我有这段简单的代码写入套接字,然后从服务器读取响应.服务器速度非常快(每次响应5ms).但是,尽管写入套接字很快 - 读取套接字的响应总是慢得多.有线索吗?
module UriTester
module UriInfo
class << self
def send_receive(socket, xml)
# socket = TCPSocket.open("service.server.com","2316")
begin
start = Time.now
socket.print(xml) # Send request
puts "just printed the xml into socket #{Time.now - start}"
rescue Errno::ECONNRESET
puts "looks like there is an issue!!!"
socket = TCPSocket.open("service.server.com","2316")
socket.print(xml) # Send request
end
response=""
while (line =socket.recv(1024))
response += line
break unless line.grep(/<\/bcap>/).empty?
end
puts "SEND_RECEIVE COMPLETED. IN #{Time.now - start}"
# socket.close
response
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
谢谢!
写入套接字总是比在这种情况下读取更快,因为写入是机器本地的,并且读取必须等待响应来自网络.
更详细地说,当调用write/send返回时,所有系统都告诉你,N个字节已成功复制到套接字内核空间缓冲区.这并不意味着数据实际上已经通过网络发送.实际上,数据可以在套接字缓冲区中存在很长时间(假设您正在使用TCP).这是因为称为Nagle算法的东西旨在有效利用网络带宽.这种看不见的Nagle延迟增加了往返时间以及获得响应的时间.服务器也可能因为在响应时间上添加更多内容而延迟响应.
因此,当你计时并快速返回时,这实际上并不意味着任何有用的东西.
如前所述,从套接字读取的时间会更长,因为当您读取时间时,实际上是计算往返行程时间加上服务器响应时间,这总是比从数据库复制数据所需的时间慢.用户空间程序到内核缓冲区.
你实际上想要衡量的是什么?为什么?