summaryrefslogtreecommitdiff
path: root/cli/bench/websocket.rs
blob: 0296d4ce876a496de191ac9ac8a911afb358b897 (plain)
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
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
use std::collections::HashMap;
use std::io::BufRead;
use std::path::Path;
use std::process::Command;
use std::process::Stdio;
use std::time::Duration;

use super::Result;

pub fn benchmark() -> Result<HashMap<String, f64>> {
  let deno_exe = test_util::deno_exe_path();

  let mut res = HashMap::new();
  let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
  let ws_dir = manifest_dir.join("bench").join("websocket");
  for entry in std::fs::read_dir(&ws_dir)? {
    let port = crate::http::get_port();
    let entry = entry?;
    let pathbuf = entry.path();
    let path = pathbuf.to_str().unwrap();
    let file_stem = pathbuf.file_stem().unwrap().to_str().unwrap();

    let mut cmd = Command::new(&deno_exe);
    let mut server = cmd
      .arg("run")
      .arg("-A")
      .arg("--unstable")
      .arg(path)
      .arg(&port.to_string())
      .spawn()
      .unwrap();

    std::thread::sleep(Duration::from_secs(5)); // wait for server to wake up.

    let load_test = test_util::prebuilt_tool_path("load_test");
    assert!(load_test.is_file());
    // ./load_test 100 0.0.0.0 8000 0 0
    // Running benchmark now...
    // Msg/sec: 161327.500000
    // Msg/sec: 163977.000000
    // ^C⏎
    let mut cmd = Command::new(load_test);
    let mut process = cmd
      .stdout(Stdio::piped())
      .arg("100")
      .arg("0.0.0.0")
      .arg(&port.to_string())
      .arg("0")
      .arg("0")
      .spawn()
      .unwrap();

    let mut lines = Vec::new();

    let mut stdout =
      std::io::BufReader::new(process.stdout.take().unwrap()).lines();
    for _ in 0..5 {
      let line = stdout.next().unwrap().unwrap();
      lines.push(line);
    }

    process.kill().unwrap();
    let msg_per_sec = lines
      .into_iter()
      .filter(|line| line.starts_with("Msg/sec:"))
      .map(|line| line.split(": ").nth(1).unwrap().parse::<f64>().unwrap())
      .max_by(|a, b| a.partial_cmp(b).unwrap())
      .unwrap();

    res.insert(file_stem.to_string(), msg_per_sec);
    server.kill().unwrap();
  }

  Ok(res)
}