The client Request now uses the same system as a server Response to track the write status of headers, and the API has been updated accordingly. Additionally, the Request constructors have been moved onto the Request object instead of being top-level hyper functions, as this better namespaces the client and Server.
71 lines
1.9 KiB
Rust
71 lines
1.9 KiB
Rust
// You have to ctrl-C after running this benchmark, since there is no way to kill
|
|
// a rust-http server.
|
|
|
|
extern crate http;
|
|
extern crate hyper;
|
|
extern crate test;
|
|
|
|
use test::Bencher;
|
|
use std::io::net::ip::{SocketAddr, Ipv4Addr};
|
|
|
|
use http::server::Server;
|
|
|
|
static phrase: &'static [u8] = b"Benchmarking hyper vs others!";
|
|
|
|
fn request(url: hyper::Url) {
|
|
let req = hyper::client::Request::get(url).unwrap();
|
|
req.start().unwrap().send().unwrap().read_to_string().unwrap();
|
|
}
|
|
|
|
fn hyper_handle(mut incoming: hyper::server::Incoming) {
|
|
for (_, mut res) in incoming {
|
|
let mut res = res.start().unwrap();
|
|
res.write(phrase).unwrap();
|
|
res.end().unwrap();
|
|
}
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_hyper(b: &mut Bencher) {
|
|
let server = hyper::Server::http(Ipv4Addr(127, 0, 0, 1), 0);
|
|
let mut listener = server.listen(hyper_handle).unwrap();
|
|
|
|
let url = hyper::Url::parse(format!("http://{}", listener.sockets[0]).as_slice()).unwrap();
|
|
b.iter(|| request(url.clone()));
|
|
listener.close().unwrap();
|
|
}
|
|
|
|
static mut created_http: bool = false;
|
|
|
|
#[deriving(Clone)]
|
|
struct HttpServer;
|
|
|
|
impl Server for HttpServer {
|
|
fn get_config(&self) -> http::server::Config {
|
|
http::server::Config {
|
|
bind_address: SocketAddr {
|
|
ip: Ipv4Addr(127, 0, 0, 1),
|
|
port: 4000
|
|
}
|
|
}
|
|
}
|
|
|
|
fn handle_request(&self, _: http::server::Request, res: &mut http::server::ResponseWriter) {
|
|
res.write(phrase).unwrap();
|
|
}
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_http(b: &mut Bencher) {
|
|
if unsafe { !created_http } {
|
|
spawn(proc() { HttpServer.serve_forever() });
|
|
unsafe { created_http = true }
|
|
// Mega hack because there is no way to wait for serve_forever to start:
|
|
std::io::timer::sleep(std::time::duration::Duration::seconds(1));
|
|
}
|
|
|
|
let url = hyper::Url::parse("http://localhost:4000").unwrap();
|
|
b.iter(|| request(url.clone()));
|
|
}
|
|
|