unic-ucd-name takes a long time to compile (nightly)
CAD97 opened this issue · comments
It's definitely degraded from when it was first merged. I'm trying to make a self-contained case to submit to the rust-lang repository as an issue in compile times.
cargo +nightly rustc --package=unic-ucd-name -- -Z time-passes
Output
Compiling unic-ucd-name v0.6.0 (file:///D:/Christopher/Documents/Code/Rust/rust-unic/unic/ucd/name)
time: 0.001; rss: 18MB parsing
time: 0.000; rss: 18MB recursion limit
time: 0.000; rss: 18MB crate injection
time: 0.000; rss: 18MB plugin loading
time: 0.000; rss: 18MB plugin registration
time: 0.000; rss: 18MB background load prev dep-graph
time: 0.582; rss: 102MB expansion
time: 0.000; rss: 102MB maybe building test harness
time: 0.009; rss: 102MB maybe creating a macro crate
time: 0.032; rss: 102MB creating allocators
time: 0.011; rss: 102MB AST validation
time: 0.122; rss: 120MB name resolution
time: 0.026; rss: 120MB complete gated feature checking
time: 0.000; rss: 120MB blocked while dep-graph loading finishes
time: 0.150; rss: 168MB lowering ast -> hir
time: 0.064; rss: 168MB early lint checks
time: 0.183; rss: 176MB indexing hir
time: 0.000; rss: 118MB load query result cache
time: 0.000; rss: 118MB looking for entry point
time: 0.000; rss: 118MB looking for plugin registrar
time: 0.010; rss: 118MB loop checking
time: 0.040; rss: 118MB static item recursion checking
time: 0.040; rss: 131MB attribute checking
time: 0.061; rss: 139MB stability checking
time: 0.197; rss: 186MB type collecting
time: 0.002; rss: 186MB outlives testing
time: 0.001; rss: 186MB impl wf inference
time: 0.024; rss: 193MB coherence checking
time: 0.001; rss: 193MB variance testing
time: 0.286; rss: 233MB wf checking
time: 4.539; rss: 306MB item-types checking
time: 0.042; rss: 311MB item-bodies checking
time: 123.153; rss: 532MB const checking # !!!!!!!!!!!!!!!!!!!!
time: 0.183; rss: 533MB privacy checking
time: 0.026; rss: 533MB intrinsic checking
time: 0.045; rss: 535MB match checking
time: 0.011; rss: 535MB liveness checking
time: 0.590; rss: 544MB borrow checking
time: 0.024; rss: 546MB MIR borrow checking
time: 0.007; rss: 546MB MIR effect checking
time: 0.048; rss: 547MB death checking
time: 0.000; rss: 547MB unused lib feature checking
time: 0.164; rss: 548MB lint checking
time: 0.000; rss: 548MB resolving dependency formats
time: 1.097; rss: 597MB write metadata
time: 0.083; rss: 598MB translation item collection
time: 0.001; rss: 598MB codegen unit partitioning
time: 0.001; rss: 602MB llvm function passes [49a7n47po4ttqjl7]
time: 0.001; rss: 604MB llvm module passes [49a7n47po4ttqjl7]
time: 0.017; rss: 623MB codegen passes [49a7n47po4ttqjl7]
time: 0.000; rss: 642MB llvm function passes [2ny9ynlpevlhfa8x]
time: 0.000; rss: 642MB llvm module passes [2ny9ynlpevlhfa8x]
time: 0.000; rss: 642MB llvm function passes [16u6js6g0l3k1ic6]
time: 0.000; rss: 642MB llvm module passes [16u6js6g0l3k1ic6]
time: 0.000; rss: 642MB llvm function passes [2jqywn86b2gsqohu]
time: 0.000; rss: 642MB llvm module passes [2jqywn86b2gsqohu]
time: 0.000; rss: 644MB llvm function passes [3fh06zvk9bptbvw9]
time: 0.000; rss: 644MB llvm module passes [3fh06zvk9bptbvw9]
time: 0.000; rss: 644MB llvm function passes [2lyh15q6cjwzy18c]
time: 0.000; rss: 644MB llvm module passes [2lyh15q6cjwzy18c]
time: 0.000; rss: 644MB llvm function passes [9fcb3syd3ne5k0n]
time: 0.000; rss: 644MB llvm module passes [9fcb3syd3ne5k0n]
time: 0.000; rss: 644MB llvm function passes [8xzrsc1ux72v29j]
time: 0.000; rss: 644MB llvm module passes [8xzrsc1ux72v29j]
time: 0.011; rss: 646MB codegen passes [2jqywn86b2gsqohu]
time: 0.017; rss: 646MB codegen passes [2ny9ynlpevlhfa8x]
time: 0.000; rss: 646MB llvm function passes [4ypvbwho0bu5tnww]
time: 0.000; rss: 646MB llvm module passes [4ypvbwho0bu5tnww]
time: 0.000; rss: 646MB llvm function passes [9elsx31vb4it187]
time: 0.000; rss: 646MB llvm module passes [9elsx31vb4it187]
time: 0.015; rss: 647MB codegen passes [2lyh15q6cjwzy18c]
time: 0.013; rss: 647MB codegen passes [9fcb3syd3ne5k0n]
time: 0.015; rss: 647MB codegen passes [3fh06zvk9bptbvw9]
time: 0.000; rss: 647MB llvm function passes [98g0d9x8aw3akpe]
time: 0.000; rss: 647MB llvm module passes [98g0d9x8aw3akpe]
time: 0.000; rss: 647MB llvm function passes [2xnvmuhjbhd7vxcm]
time: 0.000; rss: 647MB llvm module passes [2xnvmuhjbhd7vxcm]
time: 0.633; rss: 647MB translate to LLVM IR
time: 0.000; rss: 647MB assert dep graph
time: 0.000; rss: 647MB llvm function passes [1y16o1qfye96o7m0]
time: 0.000; rss: 647MB llvm module passes [1y16o1qfye96o7m0]
time: 0.029; rss: 647MB codegen passes [16u6js6g0l3k1ic6]
time: 0.010; rss: 648MB codegen passes [9elsx31vb4it187]
time: 0.000; rss: 648MB llvm function passes [524bze3gcv99ucga]
time: 0.000; rss: 648MB llvm module passes [524bze3gcv99ucga]
time: 0.013; rss: 648MB codegen passes [4ypvbwho0bu5tnww]
time: 0.000; rss: 648MB llvm function passes [48721dc4k5qxei0u]
time: 0.000; rss: 648MB llvm module passes [48721dc4k5qxei0u]
time: 0.000; rss: 648MB llvm function passes [4yh8x2b62dcih00t]
time: 0.000; rss: 648MB llvm module passes [4yh8x2b62dcih00t]
time: 0.010; rss: 648MB codegen passes [98g0d9x8aw3akpe]
time: 0.009; rss: 649MB codegen passes [1y16o1qfye96o7m0]
time: 0.011; rss: 650MB codegen passes [2xnvmuhjbhd7vxcm]
time: 0.011; rss: 650MB codegen passes [524bze3gcv99ucga]
time: 0.009; rss: 650MB codegen passes [48721dc4k5qxei0u]
time: 0.010; rss: 651MB codegen passes [8xzrsc1ux72v29j]
time: 0.009; rss: 651MB codegen passes [4yh8x2b62dcih00t]
time: 0.072; rss: 653MB llvm function passes [2iv7jmandrgcbb7e]
time: 0.000; rss: 653MB llvm module passes [2iv7jmandrgcbb7e]
time: 0.725; rss: 690MB persist query result cache
time: 0.167; rss: 746MB persist dep-graph
time: 0.892; rss: 746MB serialize dep graph
time: 2.750; rss: 746MB translation
time: 1.143; rss: 242MB codegen passes [2iv7jmandrgcbb7e]
time: 2.453; rss: 206MB LLVM passes
time: 0.002; rss: 204MB serialize work products
time: 0.433; rss: 205MB linking
Finished dev [unoptimized + debuginfo] target(s) in 135.69 secs
I think we may have stumbled across a quadratic time cost in the string interner, and my playing around with ways of formulating it back in #103/#125 stumbled across a case that at the time didn't do so bad for some reason.
(1.25 Nightly)
I modified the name tables to use static
s instead of const
s, and compile time got somewhat worse, moving from const checking to borrow checking.
Time Passes
Compiling unic-ucd-name v0.6.0 (file:///D:/Christopher/Documents/Code/Rust/rust-unic/unic/ucd/name)
time: 0.001; rss: 17MB parsing
time: 0.000; rss: 18MB recursion limit
time: 0.000; rss: 18MB crate injection
time: 0.000; rss: 18MB plugin loading
time: 0.000; rss: 18MB plugin registration
time: 0.110; rss: 91MB background load prev dep-graph
time: 0.687; rss: 159MB expansion
time: 0.000; rss: 159MB maybe building test harness
time: 0.011; rss: 159MB maybe creating a macro crate
time: 0.041; rss: 159MB creating allocators
time: 0.014; rss: 159MB AST validation
time: 0.121; rss: 177MB name resolution
time: 0.033; rss: 177MB complete gated feature checking
time: 0.000; rss: 177MB blocked while dep-graph loading finishes
time: 0.169; rss: 248MB lowering ast -> hir
time: 0.079; rss: 248MB early lint checks
time: 0.242; rss: 259MB indexing hir
time: 0.038; rss: 243MB load query result cache
time: 0.000; rss: 243MB looking for entry point
time: 0.000; rss: 243MB looking for plugin registrar
time: 0.017; rss: 243MB loop checking
time: 0.043; rss: 243MB static item recursion checking
time: 0.050; rss: 255MB attribute checking
time: 0.069; rss: 262MB stability checking
time: 0.212; rss: 303MB type collecting
time: 0.002; rss: 303MB outlives testing
time: 0.000; rss: 303MB impl wf inference
time: 0.012; rss: 309MB coherence checking
time: 0.001; rss: 309MB variance testing
time: 0.363; rss: 355MB wf checking
time: 7.722; rss: 436MB item-types checking
time: 0.045; rss: 441MB item-bodies checking
time: 0.510; rss: 481MB const checking
time: 0.263; rss: 481MB privacy checking
time: 0.027; rss: 481MB intrinsic checking
time: 0.071; rss: 483MB match checking
time: 0.013; rss: 483MB liveness checking
time: 133.775; rss: 664MB borrow checking # !!!!!!!!!!!!!!!!!!!!
time: 0.031; rss: 666MB MIR borrow checking
time: 0.007; rss: 666MB MIR effect checking
time: 0.053; rss: 666MB death checking
time: 0.000; rss: 666MB unused lib feature checking
time: 0.229; rss: 666MB lint checking
time: 0.000; rss: 666MB resolving dependency formats
time: 0.097; rss: 673MB write metadata
time: 0.736; rss: 691MB translation item collection
time: 0.081; rss: 755MB codegen unit partitioning
time: 0.001; rss: 794MB llvm function passes [49a7n47po4ttqjl7]
time: 0.000; rss: 795MB llvm module passes [49a7n47po4ttqjl7]
time: 0.000; rss: 795MB llvm function passes [2iv7jmandrgcbb7e]
time: 0.000; rss: 795MB llvm module passes [2iv7jmandrgcbb7e]
time: 0.000; rss: 796MB llvm function passes [2ny9ynlpevlhfa8x]
time: 0.000; rss: 797MB llvm module passes [2ny9ynlpevlhfa8x]
time: 0.001; rss: 796MB llvm function passes [16u6js6g0l3k1ic6]
time: 0.000; rss: 796MB llvm module passes [16u6js6g0l3k1ic6]
time: 0.000; rss: 797MB llvm function passes [2jqywn86b2gsqohu]
time: 0.000; rss: 797MB llvm module passes [2jqywn86b2gsqohu]
time: 0.001; rss: 798MB llvm function passes [3fh06zvk9bptbvw9]
time: 0.000; rss: 798MB llvm module passes [3fh06zvk9bptbvw9]
time: 0.000; rss: 799MB llvm function passes [9fcb3syd3ne5k0n]
time: 0.000; rss: 799MB llvm module passes [9fcb3syd3ne5k0n]
time: 0.016; rss: 799MB codegen passes [2iv7jmandrgcbb7e]
time: 0.014; rss: 799MB codegen passes [2ny9ynlpevlhfa8x]
time: 0.000; rss: 799MB llvm function passes [8xzrsc1ux72v29j]
time: 0.000; rss: 799MB llvm module passes [8xzrsc1ux72v29j]
time: 0.000; rss: 799MB llvm function passes [4ypvbwho0bu5tnww]
time: 0.000; rss: 799MB llvm module passes [4ypvbwho0bu5tnww]
time: 0.026; rss: 799MB codegen passes [49a7n47po4ttqjl7]
time: 0.015; rss: 799MB codegen passes [16u6js6g0l3k1ic6]
time: 0.013; rss: 799MB codegen passes [2jqywn86b2gsqohu]
time: 0.000; rss: 799MB llvm function passes [9elsx31vb4it187]
time: 0.000; rss: 799MB llvm module passes [9elsx31vb4it187]
time: 0.000; rss: 799MB llvm function passes [524bze3gcv99ucga]
time: 0.000; rss: 799MB llvm module passes [524bze3gcv99ucga]
time: 0.000; rss: 799MB llvm function passes [1y16o1qfye96o7m0]
time: 0.000; rss: 799MB llvm module passes [1y16o1qfye96o7m0]
time: 0.071; rss: 802MB llvm function passes [1xct7l288j7387hl]
time: 0.000; rss: 802MB llvm module passes [1xct7l288j7387hl]
time: 0.270; rss: 816MB codegen passes [1y16o1qfye96o7m0]
time: 0.655; rss: 816MB translate to LLVM IR
time: 0.000; rss: 816MB assert dep graph
time: 0.278; rss: 816MB codegen passes [9elsx31vb4it187]
time: 0.291; rss: 816MB codegen passes [9fcb3syd3ne5k0n]
time: 0.274; rss: 816MB codegen passes [524bze3gcv99ucga]
time: 0.281; rss: 816MB codegen passes [4ypvbwho0bu5tnww]
time: 0.000; rss: 816MB llvm function passes [4yh8x2b62dcih00t]
time: 0.000; rss: 816MB llvm module passes [4yh8x2b62dcih00t]
time: 0.292; rss: 816MB codegen passes [3fh06zvk9bptbvw9]
time: 0.619; rss: 857MB codegen passes [8xzrsc1ux72v29j]
time: 0.329; rss: 857MB codegen passes [4yh8x2b62dcih00t]
time: 0.848; rss: 916MB persist query result cache
time: 0.144; rss: 956MB persist dep-graph
time: 0.992; rss: 956MB serialize dep graph
time: 3.080; rss: 956MB translation
time: 1.030; rss: 324MB codegen passes [1xct7l288j7387hl]
time: 1.829; rss: 277MB LLVM passes
time: 0.005; rss: 277MB serialize work products
time: 0.176; rss: 278MB linking
Finished dev [unoptimized + debuginfo] target(s) in 149.88 secs
diff
diff --git a/gen/src/writer/ucd/name.rs b/gen/src/writer/ucd/name.rs
index 180ee9b..cd8484c 100644
--- a/gen/src/writer/ucd/name.rs
+++ b/gen/src/writer/ucd/name.rs
@@ -47,7 +47,7 @@ fn emit_name_tables(dir: &Path) {
for piece in values.iter() {
writeln!(
values_contents,
- "const {}: &str = \"{}\";",
+ "static {}: &str = \"{}\";",
piece.replace('-', "_"),
piece
).unwrap();
@@ -64,7 +64,7 @@ fn emit_name_tables(dir: &Path) {
record
.pieces
.iter()
- .map(|s| s.replace('-', "_"))
+ .map(|s| format!("&{}", s.replace('-', "_")))
.collect::<Vec<_>>()
.join(", ")
)
diff --git a/unic/ucd/name/src/name.rs b/unic/ucd/name/src/name.rs
index 05ea96f..5d249c0 100644
--- a/unic/ucd/name/src/name.rs
+++ b/unic/ucd/name/src/name.rs
@@ -12,7 +12,7 @@ use core::fmt;
#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct Name {
- pieces: &'static [&'static str],
+ pieces: &'static [&'static &'static str],
}
#[cfg_attr(feature = "clippy", allow(len_without_is_empty))]
@@ -47,5 +47,5 @@ impl fmt::Display for Name {
mod data {
use unic_char_property::tables::CharDataTable;
include!("../tables/name_values.rsd");
- pub const NAMES: CharDataTable<&[&str]> = include!("../tables/name_map.rsv");
+ pub static NAMES: CharDataTable<&[&&str]> = include!("../tables/name_map.rsv");
}
diff --git a/unic/ucd/name/tables/name_map.rsv b/unic/ucd/name/tables/name_map.rsv
index c002b09..fb42443 100644
--- a/unic/ucd/name/tables/name_map.rsv
+++ b/unic/ucd/name/tables/name_map.rsv
@@ -1,31527 +1,31527 @@
-// omitted (generated)
+// omitted (generated)
diff --git a/unic/ucd/name/tables/name_values.rsd b/unic/ucd/name/tables/name_values.rsd
index 454944e..264530d 100644
--- a/unic/ucd/name/tables/name_values.rsd
+++ b/unic/ucd/name/tables/name_values.rsd
@@ -1,13767 +1,13767 @@
-// omitted (generated)
+// omitted (generated)
See rust-lang/rust#48009 for the upstream issue report. Turns out this is only on nightly (I thought my default at the time was stable but it was nightly).
Some people at the miri thread has suggested to use an binary file for storing the items, then loading it with include_bytes!
. This way it should be least stressing to the compiler.
Maybe try using some serde-based format (which doesn't need a separate schema file) or Cap'n Proto (which is mmap-friendly) to store the data?
I decided to work on a PR using Cap'n Proto. Stay tuned.
Giving up for now due to capnproto/capnproto-rust#71 and extensive no_std
usage inside this crate.
....I am so confused. The compile time unregressed on the latest nightly (27a046e93 2018-02-18)
and is fine on stable/beta (~19s) / nightly (~16s) currently...