1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
require 'bm_common'
url = ARGV.shift or raise
proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
url = URI.parse(url)
proxy = URI.parse(proxy) if proxy
threads = 1
number = 10
download_size = 10 * 1024 * 1024
def do_threads(number)
threads = []
results = []
number.times do
threads << Thread.new {
results << yield
}
end
threads.map { |th| th.join }
results
end
Benchmark.bmbm do |bm|
if defined?(Curl)
bm.report('curb') do
do_threads(threads) {
(1..number).collect {
Curl::Easy.download(url.to_s, 'download_curb')
raise if download_size != File.lstat('download_curb').size
}
}
end
end
if defined?(RFuzz)
bm.report('RFuzz::HttpClient') do
do_threads(threads) {
if proxy
host, port = proxy.host, proxy.port
else
host, port = url.host, url.port
end
path = proxy ? url.to_s : url.path
c = RFuzz::HttpClient.new(host, port)
result = (1..number).collect {
File.open('download_rfuzz', 'wb') do |file|
file.write(c.get(path).http_body)
end
raise if download_size != File.lstat('download_rfuzz').size
}
c.reset
result
}
end
end
if defined?(Net::HTTP)
bm.report('Net::HTTP') do
do_threads(threads) {
if proxy
c = Net::HTTP::Proxy(proxy.host, proxy.port).new(url.host, url.port)
else
c = Net::HTTP.new(url.host, url.port)
end
c.start
result = (1..number).collect {
File.open('download_net_http', 'wb') do |file|
c.get(url.path) do |data|
file.write(data)
end
end
raise if download_size != File.lstat('download_net_http').size
}
c.finish
result
}
end
end
if defined?(HTTPClient)
bm.report('HTTPClient') do
c = HTTPClient.new(proxy)
do_threads(threads) {
(1..number).collect {
File.open('download_httpclient', 'wb') do |file|
c.get_content(url) do |data|
file.write(data)
end
end
raise if download_size != File.lstat('download_httpclient').size
}
}
c.reset_all
end
end
if defined?(OpenURI)
bm.report('open-uri') do
size = 16 * 1024
do_threads(threads) {
(1..number).collect {
File.open('download_open-uri', 'wb') do |file|
open(url, :proxy => proxy) { |f|
FileUtils.copy_stream(f, file)
}
end
raise if download_size != File.lstat('download_open-uri').size
}
}
end
end
if defined?(HTTParty)
class HTTPartyClient # need to create subclass for http_proxy
include HTTParty
end
bm.report('HTTParty') do
HTTPartyClient.http_proxy(proxy.host, proxy.port) if proxy
do_threads(threads) {
(1..number).collect {
File.open('download_httparty', 'wb') do |file|
file.write(HTTPartyClient.get(url.to_s))
end
raise if download_size != File.lstat('download_httparty').size
}
}
end
end
end
|