summaryrefslogtreecommitdiffstats
path: root/third_party/rust/ws/examples/bench.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--third_party/rust/ws/examples/bench.rs79
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
+ )
+}