b8b41c5f41
5354: Add opt-in mimalloc feature r=matklad a=ivan This adds a `mimalloc` feature to use [mimalloc](https://github.com/microsoft/mimalloc) via [mimalloc_rust](https://github.com/purpleprotocol/mimalloc_rust), and a corresponding `cargo xtask install --server --mimalloc`. In my tests on Linux, mimalloc seems to run consistently faster than jemalloc and uses only slightly more memory in `analysis-stats` on chalk. Also, builds with mimalloc produce a binary 3MB smaller than builds with jemalloc. A summary of `env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/` runs on NixOS master on an Intel 4790K in VMware Workstation: <table> <tr> <td></td><td>self-reported time</td><td>elapsed time</td><td>max RSS</td> </tr> <tr><td>glibc 2.30 run 1</td><td>225.1 sec</td><td>3:46.91</td><td>1075208</td></tr> <tr><td>glibc 2.30 run 2</td><td>228.4 sec</td><td>3:50.13</td><td>1074996</td></tr> <tr><td>jemalloc run 1</td><td>201.8 sec</td><td>3:23.03</td><td>1055960</td></tr> <tr><td>jemalloc run 2</td><td>199.2 sec</td><td>3:20.41</td><td>1065040</td></tr> <tr><td>mimalloc run 1</td><td>188.6 sec</td><td>3:09.77</td><td>1105584</td></tr> <tr><td>mimalloc run 2</td><td>185.0 sec</td><td>3:06.23</td><td>1108132</td></tr> <tr><td>mimalloc + lto run 1</td><td>160.7 sec</td><td>2:41.80</td><td>1106076</td></tr> <tr><td>mimalloc + lto run 2</td><td>162.2 sec</td><td>2:43.31</td><td>1104268</td></tr> </tr> </table> I included an `lto = true; codegen-units = 1` run out of curiosity, this PR doesn't enable it. <details> <summary>analysis-stats benchmark runs</summary> ## default ``` # env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/ Finished release [optimized] target(s) in 0.10s Running `target/release/rust-analyzer analysis-stats ../chalk/` [ERROR ra_project_model] cyclic dependency chalk-integration -> chalk-engine [ERROR ra_project_model] cyclic dependency chalk-recursive -> chalk-integration [ERROR ra_project_model] cyclic dependency chalk-solve -> chalk-integration Database loaded 333.880345ms Crates in this dir: 11 Total modules found: 159 Total declarations: 2631 Total functions: 1947 Item Collection: 10.176299461s, 0b allocated 0b resident Total expressions: 57094 Expressions of unknown type: 2938 (5%) Expressions of partially unknown type: 2427 (4%) Type mismatches: 232 Inference: 214.968806927s, 0b allocated 0b resident Total: 225.145114417s, 0b allocated 0b resident Command being timed: "cargo run --release -p rust-analyzer -- analysis-stats ../chalk/" User time (seconds): 225.34 System time (seconds): 1.49 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 3:46.91 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1075208 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 6 Minor (reclaiming a frame) page faults: 294711 Voluntary context switches: 365 Involuntary context switches: 3273 Swaps: 0 File system inputs: 2904 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 # env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/ Finished release [optimized] target(s) in 0.10s Running `target/release/rust-analyzer analysis-stats ../chalk/` [ERROR ra_project_model] cyclic dependency chalk-integration -> chalk-engine [ERROR ra_project_model] cyclic dependency chalk-recursive -> chalk-integration [ERROR ra_project_model] cyclic dependency chalk-solve -> chalk-integration Database loaded 332.711598ms Crates in this dir: 11 Total modules found: 159 Total declarations: 2631 Total functions: 1947 Item Collection: 9.895020518s, 0b allocated 0b resident Total expressions: 57094 Expressions of unknown type: 2938 (5%) Expressions of partially unknown type: 2427 (4%) Type mismatches: 232 Inference: 218.5001697s, 0b allocated 0b resident Total: 228.39519833s, 0b allocated 0b resident Command being timed: "cargo run --release -p rust-analyzer -- analysis-stats ../chalk/" User time (seconds): 228.26 System time (seconds): 1.75 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 3:50.13 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1074996 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 9 Minor (reclaiming a frame) page faults: 294748 Voluntary context switches: 330 Involuntary context switches: 1561 Swaps: 0 File system inputs: 12608 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 ``` ## jemalloc ``` # env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/ Finished release [optimized] target(s) in 0.11s Running `target/release/rust-analyzer analysis-stats ../chalk/` [ERROR ra_project_model] cyclic dependency chalk-integration -> chalk-engine [ERROR ra_project_model] cyclic dependency chalk-recursive -> chalk-integration [ERROR ra_project_model] cyclic dependency chalk-solve -> chalk-integration Database loaded 356.090374ms Crates in this dir: 11 Total modules found: 159 Total declarations: 2631 Total functions: 1947 Item Collection: 10.176550183s, 439mb allocated 465mb resident Total expressions: 57094 Expressions of unknown type: 2938 (5%) Expressions of partially unknown type: 2427 (4%) Type mismatches: 232 Inference: 191.607201827s, 993mb allocated 1036mb resident Total: 201.783937913s, 993mb allocated 1036mb resident Command being timed: "cargo run --release -p rust-analyzer -- analysis-stats ../chalk/" User time (seconds): 201.07 System time (seconds): 1.89 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 3:23.03 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1055960 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 357755 Voluntary context switches: 240 Involuntary context switches: 1889 Swaps: 0 File system inputs: 256 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 # env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/ Finished release [optimized] target(s) in 0.10s Running `target/release/rust-analyzer analysis-stats ../chalk/` [ERROR ra_project_model] cyclic dependency chalk-integration -> chalk-engine [ERROR ra_project_model] cyclic dependency chalk-recursive -> chalk-integration [ERROR ra_project_model] cyclic dependency chalk-solve -> chalk-integration Database loaded 317.917622ms Crates in this dir: 11 Total modules found: 159 Total declarations: 2631 Total functions: 1947 Item Collection: 9.902142185s, 439mb allocated 463mb resident Total expressions: 57094 Expressions of unknown type: 2938 (5%) Expressions of partially unknown type: 2427 (4%) Type mismatches: 232 Inference: 189.295317017s, 993mb allocated 1046mb resident Total: 199.197555943s, 993mb allocated 1046mb resident Command being timed: "cargo run --release -p rust-analyzer -- analysis-stats ../chalk/" User time (seconds): 198.64 System time (seconds): 1.67 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 3:20.41 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1065040 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 369013 Voluntary context switches: 243 Involuntary context switches: 2835 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 ``` ## mimalloc ``` # env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/ Finished release [optimized] target(s) in 0.12s Running `target/release/rust-analyzer analysis-stats ../chalk/` [ERROR ra_project_model] cyclic dependency chalk-integration -> chalk-engine [ERROR ra_project_model] cyclic dependency chalk-recursive -> chalk-integration [ERROR ra_project_model] cyclic dependency chalk-solve -> chalk-integration Database loaded 332.116806ms Crates in this dir: 11 Total modules found: 159 Total declarations: 2631 Total functions: 1947 Item Collection: 9.796643695s, 0b allocated 0b resident Total expressions: 57094 Expressions of unknown type: 2938 (5%) Expressions of partially unknown type: 2427 (4%) Type mismatches: 232 Inference: 178.82132362s, 0b allocated 0b resident Total: 188.617975605s, 0b allocated 0b resident Command being timed: "cargo run --release -p rust-analyzer -- analysis-stats ../chalk/" User time (seconds): 187.70 System time (seconds): 1.97 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 3:09.77 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1105584 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 296481 Voluntary context switches: 222 Involuntary context switches: 1868 Swaps: 0 File system inputs: 256 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 # env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/ Finished release [optimized] target(s) in 0.13s Running `target/release/rust-analyzer analysis-stats ../chalk/` [ERROR ra_project_model] cyclic dependency chalk-integration -> chalk-engine [ERROR ra_project_model] cyclic dependency chalk-recursive -> chalk-integration [ERROR ra_project_model] cyclic dependency chalk-solve -> chalk-integration Database loaded 320.046776ms Crates in this dir: 11 Total modules found: 159 Total declarations: 2631 Total functions: 1947 Item Collection: 9.287690124s, 0b allocated 0b resident Total expressions: 57094 Expressions of unknown type: 2938 (5%) Expressions of partially unknown type: 2427 (4%) Type mismatches: 232 Inference: 175.710939697s, 0b allocated 0b resident Total: 184.998640033s, 0b allocated 0b resident Command being timed: "cargo run --release -p rust-analyzer -- analysis-stats ../chalk/" User time (seconds): 184.38 System time (seconds): 1.81 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 3:06.23 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1108132 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 297055 Voluntary context switches: 374 Involuntary context switches: 2374 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 ``` ## mimalloc + lto ``` # env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/ Finished release [optimized] target(s) in 0.11s Running `target/release/rust-analyzer analysis-stats ../chalk/` [ERROR ra_project_model] cyclic dependency chalk-integration -> chalk-engine [ERROR ra_project_model] cyclic dependency chalk-recursive -> chalk-integration [ERROR ra_project_model] cyclic dependency chalk-solve -> chalk-integration Database loaded 369.600196ms Crates in this dir: 11 Total modules found: 159 Total declarations: 2631 Total functions: 1947 Item Collection: 7.572726834s, 0b allocated 0b resident Total expressions: 57094 Expressions of unknown type: 2938 (5%) Expressions of partially unknown type: 2427 (4%) Type mismatches: 232 Inference: 153.090899101s, 0b allocated 0b resident Total: 160.663635235s, 0b allocated 0b resident Command being timed: "cargo run --release -p rust-analyzer -- analysis-stats ../chalk/" User time (seconds): 160.01 System time (seconds): 1.70 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 2:41.80 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1106076 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 1 Minor (reclaiming a frame) page faults: 296610 Voluntary context switches: 209 Involuntary context switches: 2798 Swaps: 0 File system inputs: 8 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 # env time -v cargo run --release -p rust-analyzer -- analysis-stats ../chalk/ Finished release [optimized] target(s) in 0.10s Running `target/release/rust-analyzer analysis-stats ../chalk/` [ERROR ra_project_model] cyclic dependency chalk-integration -> chalk-engine [ERROR ra_project_model] cyclic dependency chalk-recursive -> chalk-integration [ERROR ra_project_model] cyclic dependency chalk-solve -> chalk-integration Database loaded 334.630658ms Crates in this dir: 11 Total modules found: 159 Total declarations: 2631 Total functions: 1947 Item Collection: 7.71699197s, 0b allocated 0b resident Total expressions: 57094 Expressions of unknown type: 2938 (5%) Expressions of partially unknown type: 2427 (4%) Type mismatches: 232 Inference: 154.50351318s, 0b allocated 0b resident Total: 162.220513775s, 0b allocated 0b resident Command being timed: "cargo run --release -p rust-analyzer -- analysis-stats ../chalk/" User time (seconds): 161.52 System time (seconds): 1.74 Percent of CPU this job got: 99% Elapsed (wall clock) time (h:mm:ss or m:ss): 2:43.31 Average shared text size (kbytes): 0 Average unshared data size (kbytes): 0 Average stack size (kbytes): 0 Average total size (kbytes): 0 Maximum resident set size (kbytes): 1104268 Average resident set size (kbytes): 0 Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 296183 Voluntary context switches: 200 Involuntary context switches: 1666 Swaps: 0 File system inputs: 0 File system outputs: 0 Socket messages sent: 0 Socket messages received: 0 Signals delivered: 0 Page size (bytes): 4096 Exit status: 0 ``` </details> Co-authored-by: Ivan Kozik <ivan@ludios.org>
70 lines
1.8 KiB
TOML
70 lines
1.8 KiB
TOML
[package]
|
|
edition = "2018"
|
|
name = "rust-analyzer"
|
|
version = "0.1.0"
|
|
authors = ["rust-analyzer developers"]
|
|
autobins = false
|
|
license = "MIT OR Apache-2.0"
|
|
|
|
[lib]
|
|
doctest = false
|
|
|
|
[[bin]]
|
|
name = "rust-analyzer"
|
|
path = "src/bin/main.rs"
|
|
|
|
[dependencies]
|
|
anyhow = "1.0.26"
|
|
crossbeam-channel = "0.4.0"
|
|
env_logger = { version = "0.7.1", default-features = false }
|
|
globset = "0.4.4"
|
|
itertools = "0.9.0"
|
|
jod-thread = "0.1.0"
|
|
log = "0.4.8"
|
|
lsp-types = { version = "0.76.0", features = ["proposed"] }
|
|
parking_lot = "0.11.0"
|
|
pico-args = "0.3.1"
|
|
rand = { version = "0.7.3", features = ["small_rng"] }
|
|
rustc-hash = "1.1.0"
|
|
serde = { version = "1.0.106", features = ["derive"] }
|
|
serde_json = "1.0.48"
|
|
threadpool = "1.7.1"
|
|
rayon = "1.3.1"
|
|
|
|
stdx = { path = "../stdx" }
|
|
|
|
lsp-server = "0.3.3"
|
|
flycheck = { path = "../flycheck" }
|
|
ra_ide = { path = "../ra_ide" }
|
|
ra_prof = { path = "../ra_prof" }
|
|
ra_project_model = { path = "../ra_project_model" }
|
|
ra_syntax = { path = "../ra_syntax" }
|
|
ra_text_edit = { path = "../ra_text_edit" }
|
|
vfs = { path = "../vfs" }
|
|
vfs-notify = { path = "../vfs-notify" }
|
|
ra_cfg = { path = "../ra_cfg"}
|
|
ra_toolchain = { path = "../ra_toolchain" }
|
|
|
|
# This should only be used in CLI
|
|
ra_db = { path = "../ra_db" }
|
|
ra_ide_db = { path = "../ra_ide_db" }
|
|
ra_ssr = { path = "../ra_ssr" }
|
|
hir = { path = "../ra_hir", package = "ra_hir" }
|
|
hir_def = { path = "../ra_hir_def", package = "ra_hir_def" }
|
|
hir_ty = { path = "../ra_hir_ty", package = "ra_hir_ty" }
|
|
ra_proc_macro_srv = { path = "../ra_proc_macro_srv" }
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
winapi = "0.3.8"
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3.1.0"
|
|
expect = { path = "../expect" }
|
|
test_utils = { path = "../test_utils" }
|
|
mbe = { path = "../ra_mbe", package = "ra_mbe" }
|
|
tt = { path = "../ra_tt", package = "ra_tt" }
|
|
|
|
[features]
|
|
jemalloc = [ "ra_prof/jemalloc" ]
|
|
mimalloc = [ "ra_prof/mimalloc" ]
|