]> git.lizzy.rs Git - rust.git/commitdiff
Report memory use in time-passes
authorNick Cameron <ncameron@mozilla.com>
Sun, 28 Jun 2015 01:37:33 +0000 (18:37 -0700)
committerNick Cameron <ncameron@mozilla.com>
Wed, 1 Jul 2015 21:36:32 +0000 (09:36 +1200)
Reports the resident set size after each pass (linux-only).

src/librustc/lib.rs
src/librustc/util/common.rs

index 2cec42b76bce3359e8f772ea1bda80a492cbabd3..e4e7459f8c60581557b7285f14a241acba3684a7 100644 (file)
@@ -62,6 +62,7 @@
 #![feature(vec_push_all)]
 #![feature(wrapping)]
 #![feature(cell_extras)]
+#![feature(page_size)]
 #![cfg_attr(test, feature(test))]
 
 #![allow(trivial_casts)]
index 8d5357fa6e4170a2285c57bf3650e61c946e94a9..162bf6ed9a97f5dbfb6c8393fb51b299e812249c 100644 (file)
@@ -59,14 +59,50 @@ pub fn time<T, U, F>(do_it: bool, what: &str, u: U, f: F) -> T where
     const NANOS_PER_SEC: f64 = 1_000_000_000.0;
     let secs = dur.secs() as f64;
     let secs = secs + dur.extra_nanos() as f64 / NANOS_PER_SEC;
-    println!("{}time: {:.3} \t{}", repeat("  ").take(old).collect::<String>(),
-             secs, what);
+
+    let mem_string = match get_resident() {
+        Some(n) => {
+            let mb = n as f64 / 1_000_000.0;
+            format!("; rss: {}MB", mb.round() as usize)
+        }
+        None => "".to_owned(),
+    };
+    println!("{}time: {:.3}{}\t{}", repeat("  ").take(old).collect::<String>(),
+             secs, mem_string, what);
 
     DEPTH.with(|slot| slot.set(old));
 
     rv
 }
 
+// Memory reporting
+fn get_resident() -> Option<usize> {
+    if cfg!(unix) {
+        get_proc_self_statm_field(1)
+    } else {
+        None
+    }
+}
+
+// Like std::macros::try!, but for Option<>.
+macro_rules! option_try(
+    ($e:expr) => (match $e { Some(e) => e, None => return None })
+);
+
+fn get_proc_self_statm_field(field: usize) -> Option<usize> {
+    use std::fs::File;
+    use std::io::Read;
+
+    assert!(cfg!(unix));
+
+    let mut f = option_try!(File::open("/proc/self/statm").ok());
+    let mut contents = String::new();
+    option_try!(f.read_to_string(&mut contents).ok());
+    let s = option_try!(contents.split_whitespace().nth(field));
+    let npages = option_try!(s.parse::<usize>().ok());
+    Some(npages * ::std::env::page_size())
+}
+
 pub fn indent<R, F>(op: F) -> R where
     R: Debug,
     F: FnOnce() -> R,