about summary refs log tree commit diff
diff options
context:
space:
mode:
authorblyxyas <blyxyas@gmail.com>2023-06-10 11:21:28 +0200
committerblyxyas <blyxyas@gmail.com>2023-06-26 20:32:32 +0200
commitd69c4f553c69fb0e64c281f85eb5822bcdfb4739 (patch)
tree8407cb69db52dbd3614135694199560bab4132c8
parent15ed281699802aae2364b77a4e9900a9acad3d0d (diff)
downloadrust-d69c4f553c69fb0e64c281f85eb5822bcdfb4739.tar.gz
rust-d69c4f553c69fb0e64c281f85eb5822bcdfb4739.zip
Add `SPEEDTEST`
-rw-r--r--book/src/development/speedtest.md24
-rw-r--r--tests/compile-test.rs46
2 files changed, 64 insertions, 6 deletions
diff --git a/book/src/development/speedtest.md b/book/src/development/speedtest.md
new file mode 100644
index 00000000000..0db718e6ad6
--- /dev/null
+++ b/book/src/development/speedtest.md
@@ -0,0 +1,24 @@
+# Speedtest
+`SPEEDTEST` is the tool we use to measure lint's performance, it works by executing the same test several times.
+
+It's useful for measuring changes to current lints and deciding if the performance changes too much. `SPEEDTEST` is
+accessed by the `SPEEDTEST` (and `SPEEDTEST_*`) environment variables.
+
+## Checking Speedtest
+
+To do a simple speed test of a lint (e.g. `allow_attributes`), use this command.
+
+```sh
+$ SPEEDTEST=ui TESTNAME="allow_attributes" cargo uitest -- --nocapture
+```
+
+This will test all `ui` tests (`SPEEDTEST=ui`) whose names start with `allow_attributes`. By default, `SPEEDTEST` will
+iterate your test 1000 times. But you can change this with `SPEEDTEST_ITERATIONS`.
+
+```sh
+$ SPEEDTEST=toml SPEEDTEST_ITERATIONS=100 TESTNAME="semicolon_block" cargo uitest -- --nocapture
+```
+
+> **WARNING**: Be sure to use `-- --nocapture` at the end of the command to see the average test time. If you don't
+> use `-- --nocapture` (e.g. `SPEEDTEST=ui` `TESTNAME="let_underscore_untyped" cargo uitest -- --nocapture`), this
+> will not show up.
diff --git a/tests/compile-test.rs b/tests/compile-test.rs
index c5e8622bc85..c45339ba0b5 100644
--- a/tests/compile-test.rs
+++ b/tests/compile-test.rs
@@ -213,12 +213,46 @@ fn run_ui_cargo() {
 
 fn main() {
     set_var("CLIPPY_DISABLE_DOCS_LINKS", "true");
-    run_ui();
-    run_ui_toml();
-    run_ui_cargo();
-    run_internal_tests();
-    rustfix_coverage_known_exceptions_accuracy();
-    ui_cargo_toml_metadata();
+    // The SPEEDTEST_* env variables can be used to check Clippy's performance on your PR. It runs the
+    // affected test 1000 times and gets the average.
+    if let Ok(speedtest) = std::env::var("SPEEDTEST") {
+        println!("----------- STARTING SPEEDTEST -----------");
+        let f;
+        match speedtest.as_str() {
+            "ui" => f = run_ui as fn(),
+            "cargo" => f = run_ui_cargo as fn(),
+            "toml" => f = run_ui_toml as fn(),
+            "internal" => f = run_internal_tests as fn(),
+			"rustfix-coverage-known-exceptions-accuracy" => f =     rustfix_coverage_known_exceptions_accuracy as fn(),
+			"ui-cargo-toml-metadata" => f = ui_cargo_toml_metadata() as fn(),
+
+            _ => panic!("unknown speedtest: {speedtest} || accepted speedtests are: [ui, cargo, toml, internal]"),
+        }
+
+        let iterations;
+        if let Ok(iterations_str) = std::env::var("SPEEDTEST_ITERATIONS") {
+            iterations = iterations_str
+                .parse::<u64>()
+                .unwrap_or_else(|_| panic!("Couldn't parse `{}`, please use a valid u64", iterations_str));
+        } else {
+            iterations = 1000;
+        }
+
+        let mut sum = 0;
+        for _ in 0..iterations {
+            let start = std::time::Instant::now();
+            f();
+            sum += start.elapsed().as_millis();
+        }
+        println!("average {} time: {} millis.", speedtest.to_uppercase(), sum / 1000);
+    } else {
+        run_ui();
+        run_ui_toml();
+        run_ui_cargo();
+        run_internal_tests();
+		rustfix_coverage_known_exceptions_accuracy();
+		ui_cargo_toml_metadata();
+    }
 }
 
 const RUSTFIX_COVERAGE_KNOWN_EXCEPTIONS: &[&str] = &[