From: Shashank Date Date: 2003-05-03T09:30:09+09:00 Subject: Re: Ruby (1.6.7) Net::FTP/OS call hang "Sean Gilbertson" wrote in message: > I tested out some file downloads to make sure that those would not > freeze anything, and they didnt seem to at all. Do you know of any > other problem areas that I should look out for? I don't know if this will apply to you, but on Win 2K, I have this program using net/ftp: #------------------------------------------------------------ require "net/ftp" ftp = Net::FTP::new("ftp-srvr") ftp.login("anonymous","") a = ftp.dir("*.*") puts a if $DEBUG tb = Time::now ftp.getbinaryfile("Sales.ppt","junk.bin") ta = Time::now puts "Ftp get took #{ta-tb} seconds" tb = Time::now ftp.putbinaryfile("junk.bin","junk.bin") ta = Time::now puts "Ftp put took #{ta-tb} seconds" puts ftp.status if $DEBUG ftp.close #----------------------------------------------------- Ran it: C:\atest>ruby -wv tst_ftp1.rb ruby 1.6.8 (2002-12-24) [i586-mswin32] Ftp get took 20.248 seconds Ftp put took 20.809 seconds Ran it with profiler: C:\atest>ruby -wv -rprofile tst_ftp1.rb ruby 1.6.8 (2002-12-24) [i586-mswin32] Ftp get took 23.703 seconds Ftp put took 23.132 seconds % cumulative self self total time seconds seconds calls ms/call ms/call name 85.22 16.51 16.51 808 20.44 20.44 IO#read 6.97 17.87 1.35 3 450.33 6248.67 Kernel.loop 2.74 18.40 0.53 814 0.65 0.85 Proc#call 1.29 18.65 0.25 3 83.33 123.33 Kernel.require 1.19 18.88 0.23 821 0.28 0.28 IO#write [snip] Notice how IO#read took 85% of the time Then ran the native ftp client: C:\atest>ftp ftp-srvr Connected to ftp-srvr.abc.xyz.com. 220 DBM-Team FTP Server User (ftp-srvr.abc.xyz.com:(none)): anonymous 331 User name okay, please send complete E-mail address as password. Password: 230 User logged in, proceed. ftp> binary 200 Type set to I. ftp> get Sales.ppt 200 PORT Command successful. 150 Opening BINARY mode data connection for Sales.ppt (1649152 bytes). 226 Transfer complete. ftp: 1649152 bytes received in 0.26Seconds 6318.59Kbytes/sec. ftp> put junk.bin 200 PORT Command successful. 150 Opening BINARY mode data connection for junk.bin. 226 Transfer complete. ftp: 1649152 bytes sent in 0.22Seconds 7462.23Kbytes/sec. ftp> quit 221 Goodbye! C:\atest> This was almost 100 times faster ! So I tried with Ruby 1.8 : C:\atest>ruby -wv tst_ftp1.rb ruby 1.8.0 (2003-03-03) [i386-mswin32] Ftp get took 0.511 seconds Ftp put took 0.831 seconds Great ! But it is still twice as slow ...and with the profiler: C:\atest>ruby -wv -rprofile tst_ftp1.rb ruby 1.8.0 (2003-03-03) [i386-mswin32] Ftp get took 1.533 seconds Ftp put took 1.722 seconds % cumulative self self total time seconds seconds calls ms/call ms/call name 52.79 1.33 1.33 3 444.00 644.33 Kernel.loop 9.91 1.58 0.25 808 0.31 0.31 IO#read 8.76 1.80 0.22 821 0.27 0.27 IO#write 5.15 1.93 0.13 842 0.15 0.15 String#== 3.17 2.01 0.08 3 26.67 66.67 Kernel.require 2.38 2.07 0.06 16 3.75 3.75 MonitorMixin.mon_exit 1.98 2.12 0.05 1 50.00 50.00 Profiler__.start_profile 1.98 2.17 0.05 10 5.00 12.00 Net::FTP#voidresp 1.59 2.21 0.04 15 2.67 2.67 IO#readline 1.59 2.25 0.04 16 2.50 3.13 MonitorMixin.mon_enter 1.59 2.29 0.04 16 2.50 164.56 MonitorMixin.synchronize 1.19 2.32 0.03 15 2.00 4.67 Net::FTP#getline 1.19 2.35 0.03 1 30.00 30.00 TCPSocket#initialize 1.19 2.38 0.03 6 5.00 5.00 Module#attr_accessor 0.79 2.40 0.02 15 1.33 8.00 Net::FTP#getresp 0.79 2.42 0.02 15 1.33 6.00 Net::FTP#getmultiline 0.40 2.43 0.01 1 10.00 40.00 Net::FTP#login [snip] And this is with a small 1.6MB file. As the file size grows (I tried with 400 MB file) the difference is staggering. Something to think about, eh ? -- shanko