open-i18n / rust-unic

UNIC: Unicode and Internationalization Crates for Rust

Home Page:https://crates.io/crates/unic

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 statics instead of consts, 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...