2009-09-01 74 views
0

我有一段寫入套接字的代碼,然後從服務器讀取響應。服務器速度非常快(每次5ms內響應)。但是,寫入套接字很快 - 從套接字讀取響應總是慢得多。任何線索?從TCPSocket讀取Ruby/Rails的速度很慢

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 

謝謝!

+0

這是什麼,你實際上試圖衡量,爲什麼? – 2009-09-01 14:56:40

回答

5

在這種情況下,寫入套接字始終比讀取的速度快,因爲寫入對本機是本地的,並且讀取必須等待響應通過網絡進行。

更詳細地說,當write/send的調用返回時,所有系統都在告訴你N個字節已經被成功複製到套接字內核空間緩衝區。這並不意味着數據實際上是通過網絡發送的。實際上,數據可以在套接字緩衝區中保存很長時間(假設您使用的是TCP)。這是因爲所謂的Nagle algorithm,旨在有效利用網絡帶寬。這種看不見的納格爾延遲增加了往返時間,直到得到答覆爲止。出於同樣的原因,服務器也可能延遲響應時間。

所以,當你的寫作時間和它很快返回,這實際上並不意味着什麼有用的。

如前所述,從套接字中讀取的時間會更長,因爲當你讀取的時候,你實際上是計算往返旅行時間加上服務器響應時間,這總是比時間要慢得多將數據從用戶空間程序複製到內核緩衝區。

這是什麼,你實際上試圖衡量,爲什麼?