Merge pull request #13 from oli-obk/master

benchmarks
This commit is contained in:
Scott Olson 2016-05-30 13:01:11 -06:00
commit f3923eeb50
7 changed files with 176 additions and 4 deletions

36
benches/fibonacci.rs Normal file
View file

@ -0,0 +1,36 @@
#![feature(custom_attribute, test)]
#![feature(rustc_private)]
#![allow(unused_attributes)]
extern crate test;
use test::Bencher;
mod fibonacci_helper;
#[bench]
fn fib(bencher: &mut Bencher) {
bencher.iter(|| {
fibonacci_helper::main();
})
}
mod miri_helper;
#[bench]
fn fib_miri(bencher: &mut Bencher) {
miri_helper::run("fibonacci_helper", bencher);
}
mod fibonacci_helper_iterative;
#[bench]
fn fib_iter(bencher: &mut Bencher) {
bencher.iter(|| {
fibonacci_helper_iterative::main();
})
}
#[bench]
fn fib_iter_miri(bencher: &mut Bencher) {
miri_helper::run("fibonacci_helper_iterative", bencher);
}

View file

@ -0,0 +1,16 @@
#![feature(custom_attribute)]
#![allow(unused_attributes)]
#[miri_run]
#[inline(never)]
pub fn main() {
assert_eq!(fib(10), 55);
}
fn fib(n: usize) -> usize {
if n <= 2 {
1
} else {
fib(n - 1) + fib(n - 2)
}
}

View file

@ -0,0 +1,19 @@
#![feature(custom_attribute)]
#![allow(unused_attributes)]
#[miri_run]
#[inline(never)]
pub fn main() {
assert_eq!(fib(10), 55);
}
fn fib(n: usize) -> usize {
let mut a = 0;
let mut b = 1;
for _ in 0..n {
let c = a;
a = b;
b = c + b;
}
a
}

47
benches/miri_helper.rs Normal file
View file

@ -0,0 +1,47 @@
#![feature(custom_attribute, test)]
#![feature(rustc_private)]
#![allow(unused_attributes)]
extern crate getopts;
extern crate miri;
extern crate rustc;
extern crate rustc_driver;
extern crate test;
use self::miri::interpreter;
use self::rustc::session::Session;
use self::rustc_driver::{driver, CompilerCalls};
use std::cell::RefCell;
use std::rc::Rc;
use std::env::var;
use test::Bencher;
pub struct MiriCompilerCalls<'a>(Rc<RefCell<&'a mut Bencher>>);
pub fn run(filename: &str, bencher: &mut Bencher) {
let path = var("RUST_SYSROOT").expect("env variable `RUST_SYSROOT` not set");
rustc_driver::run_compiler(&[
"miri".to_string(), format!("benches/{}.rs", filename), "--sysroot".to_string(), path.to_string(),
], &mut MiriCompilerCalls(Rc::new(RefCell::new(bencher))));
}
impl<'a> CompilerCalls<'a> for MiriCompilerCalls<'a> {
fn build_controller(
&mut self,
_: &Session,
_: &getopts::Matches
) -> driver::CompileController<'a> {
let mut control: driver::CompileController<'a> = driver::CompileController::basic();
let bencher = self.0.clone();
control.after_analysis.callback = Box::new(move |state| {
state.session.abort_if_errors();
bencher.borrow_mut().iter(|| {
interpreter::interpret_start_points(state.tcx.unwrap(), state.mir_map.unwrap());
})
});
control
}
}

41
benches/smoke.rs Normal file
View file

@ -0,0 +1,41 @@
#![feature(custom_attribute, test)]
#![feature(rustc_private)]
#![allow(unused_attributes)]
extern crate test;
use test::Bencher;
mod smoke_helper;
#[bench]
fn noop(bencher: &mut Bencher) {
bencher.iter(|| {
smoke_helper::main();
})
}
/*
// really slow
#[bench]
fn noop_miri_full(bencher: &mut Bencher) {
let path = std::env::var("RUST_SYSROOT").expect("env variable `RUST_SYSROOT` not set");
bencher.iter(|| {
let mut process = std::process::Command::new("target/release/miri");
process.arg("benches/smoke_helper.rs")
.arg("--sysroot").arg(&path);
let output = process.output().unwrap();
if !output.status.success() {
println!("{}", String::from_utf8(output.stdout).unwrap());
println!("{}", String::from_utf8(output.stderr).unwrap());
panic!("failed to run miri");
}
})
}
*/
mod miri_helper;
#[bench]
fn noop_miri_interpreter(bencher: &mut Bencher) {
miri_helper::run("smoke_helper", bencher);
}

7
benches/smoke_helper.rs Normal file
View file

@ -0,0 +1,7 @@
#![feature(custom_attribute)]
#![allow(unused_attributes)]
#[miri_run]
#[inline(never)]
pub fn main() {
}

View file

@ -1365,7 +1365,7 @@ impl<'mir, 'tcx: 'mir> Deref for CachedMir<'mir, 'tcx> {
fn deref(&self) -> &mir::Mir<'tcx> {
match *self {
CachedMir::Ref(r) => r,
CachedMir::Owned(ref rc) => &rc,
CachedMir::Owned(ref rc) => rc,
}
}
}
@ -1422,12 +1422,16 @@ pub fn interpret_start_points<'a, 'tcx>(
if attr.check_name("miri_run") {
let item = tcx.map.expect_item(id);
println!("Interpreting: {}", item.name);
if TRACE_EXECUTION {
println!("Interpreting: {}", item.name);
}
let mut gecx = GlobalEvalContext::new(tcx, mir_map);
let mut fecx = FnEvalContext::new(&mut gecx);
match fecx.call_nested(mir) {
Ok(Some(return_ptr)) => fecx.memory.dump(return_ptr.alloc_id),
Ok(Some(return_ptr)) => if TRACE_EXECUTION {
fecx.memory.dump(return_ptr.alloc_id);
},
Ok(None) => println!("(diverging function returned)"),
Err(_e) => {
// TODO(solson): Detect whether the error was already reported or not.
@ -1435,7 +1439,9 @@ pub fn interpret_start_points<'a, 'tcx>(
}
}
println!("");
if TRACE_EXECUTION {
println!("");
}
}
}
}