>> out.write("hello!\n"*10_000)
>
> AFAIK that's not the fastest of operations.
String creation itself turns out to not take too long:
>> Benchmark.measure { "hello!\n"*10_000}
=> #<Benchmark... @real=0.000353097915649414, @utime=0.0, @cstime=0.0>
So it's not a huge bottleneck. Replacing it with a static string yields
approx. the same results, which I did thanks to your suggestion.
>> latency to http_response.rb line 137
>> yielded ~938 req/s [AFAICT]
> Thin and ebb both write more like this.
Here's some results [ruby 1.8.6p287 OS X] running ab -n 300
7B response: old: 1595 req/s new: 1690 req/s (thin: 1901)
7K response: old: 1168 req/s new: 1559 req/s (thin: 1849)
70K response: old: 366 req/s new: 1140 req/s (thin: 1160)
700K response: old: 46 req/s new: 286 [or 48] req/s (thin: 295)*
So overall better results, but most noticeable at the 70K level. It
seems roughly on par with thin.
IO#write is [I think] ruby thread friendly, so I'm not sure why the
difference.
Thanks!
-=R
* or 48: With some mongrel tests it would have a single long, out of
300, that would take 4s while the others all took 20ms. Not sure why.
Excluding that, it ran at the 286
patch:
Index: lib/mongrel/http_response.rb
===================================================================
--- lib/mongrel/http_response.rb (revision 1036)
+++ lib/mongrel/http_response.rb (working copy)
@@ -137,7 +137,15 @@
end
def write(data)
- @socket.write(data)
+ while data and data.length > 0
+ begin
+ amount_wrote = @socket.write_nonblock(data)
+ data = data[amount_wrote..-1]
+ rescue Errno::EAGAIN
+ # wait for it to become writable again
+ select nil, [EMAIL PROTECTED], nil, nil
+ end
+ end
rescue => details
socket_error(details)
end
--
Posted via http://www.ruby-forum.com/.
_______________________________________________
Mongrel-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/mongrel-users