diff options
Diffstat (limited to '')
-rw-r--r-- | third_party/rust/ws/examples/bench.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/third_party/rust/ws/examples/bench.rs b/third_party/rust/ws/examples/bench.rs new file mode 100644 index 0000000000..427f84147f --- /dev/null +++ b/third_party/rust/ws/examples/bench.rs @@ -0,0 +1,79 @@ +extern crate env_logger; +extern crate time; +extern crate url; +/// A simple, but immature, benchmark client for destroying other WebSocket frameworks and proving +/// WS-RS's performance excellence. ;) +/// Make sure you allow for enough connections in your OS (e.g. ulimit -Sn 10000). +extern crate ws; + +// Try this against node for some fun + +// TODO: Separate this example into a separate lib +// TODO: num threads, num connections per thread, num concurrent connections per thread, num +// messages per connection, length of message, text or binary + +use ws::{Builder, CloseCode, Handler, Handshake, Message, Result, Sender, Settings}; + +const CONNECTIONS: usize = 10_000; // simultaneous +const MESSAGES: u32 = 10; +static MESSAGE: &'static str = "TEST TEST TEST TEST TEST TEST TEST TEST"; + +fn main() { + env_logger::init(); + + let url = url::Url::parse("ws://127.0.0.1:3012").unwrap(); + + struct Connection { + out: Sender, + count: u32, + time: u64, + total: u64, + } + + impl Handler for Connection { + fn on_open(&mut self, _: Handshake) -> Result<()> { + self.out.send(MESSAGE)?; + self.count += 1; + self.time = time::precise_time_ns(); + Ok(()) + } + + fn on_message(&mut self, msg: Message) -> Result<()> { + assert_eq!(msg.as_text().unwrap(), MESSAGE); + if self.count > MESSAGES { + self.out.close(CloseCode::Normal)?; + } else { + self.out.send(MESSAGE)?; + let time = time::precise_time_ns(); + // println!("time {}", time -self.time); + self.total += time - self.time; + self.count += 1; + self.time = time; + } + Ok(()) + } + } + + let mut ws = Builder::new() + .with_settings(Settings { + max_connections: CONNECTIONS, + ..Settings::default() + }) + .build(|out| Connection { + out, + count: 0, + time: 0, + total: 0, + }) + .unwrap(); + + for _ in 0..CONNECTIONS { + ws.connect(url.clone()).unwrap(); + } + let start = time::precise_time_ns(); + ws.run().unwrap(); + println!( + "Total time. {}", + (time::precise_time_ns() - start) / 1_000_000 + ) +} |