auto merge of #12105 : huonw/rust/bench-black-box, r=alexcrichton

This allows a result to be marked as "used" by passing it to a function
LLVM cannot see inside (unless LTO is enabled).

Closes #8261.
This commit is contained in:
bors 2014-02-08 18:46:27 -08:00
commit fddc18ec4b
3 changed files with 24 additions and 12 deletions

View File

@ -536,18 +536,18 @@ mod test {
x: 1,
y: 2,
z: 3,
});
})
})
}
#[bench]
pub fn bench_pod_nonarena(bh: &mut BenchHarness) {
bh.iter(|| {
let _ = ~Point {
~Point {
x: 1,
y: 2,
z: 3,
};
}
})
}
@ -561,7 +561,7 @@ mod test {
y: 2,
z: 3,
}
});
})
})
}
@ -588,17 +588,17 @@ mod test {
arena.alloc(Nonpod {
string: ~"hello world",
array: ~[ 1, 2, 3, 4, 5 ],
});
})
})
}
#[bench]
pub fn bench_nonpod_nonarena(bh: &mut BenchHarness) {
bh.iter(|| {
let _ = ~Nonpod {
~Nonpod {
string: ~"hello world",
array: ~[ 1, 2, 3, 4, 5 ],
};
}
})
}
@ -606,10 +606,10 @@ mod test {
pub fn bench_nonpod_old_arena(bh: &mut BenchHarness) {
let arena = Arena::new();
bh.iter(|| {
let _ = arena.alloc(|| Nonpod {
arena.alloc(|| Nonpod {
string: ~"hello world",
array: ~[ 1, 2, 3, 4, 5 ],
});
})
})
}
}

View File

@ -29,7 +29,7 @@ Rust extras are part of the standard Rust distribution.
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://static.rust-lang.org/doc/master")];
#[feature(macro_rules, globs, managed_boxes)];
#[feature(macro_rules, globs, managed_boxes, asm)];
#[deny(non_camel_case_types)];
#[deny(missing_doc)];

View File

@ -1091,13 +1091,25 @@ impl MetricMap {
// Benchmarking
/// A function that is opaque to the optimiser, to allow benchmarks to
/// pretend to use outputs to assist in avoiding dead-code
/// elimination.
///
/// This function is a no-op, and does not even read from `dummy`.
pub fn black_box<T>(dummy: T) {
// we need to "use" the argument in some way LLVM can't
// introspect.
unsafe {asm!("" : : "r"(&dummy))}
}
impl BenchHarness {
/// Callback for benchmark functions to run in their body.
pub fn iter(&mut self, inner: ||) {
pub fn iter<T>(&mut self, inner: || -> T) {
self.ns_start = precise_time_ns();
let k = self.iterations;
for _ in range(0u64, k) {
inner();
black_box(inner());
}
self.ns_end = precise_time_ns();
}