
296
이펙티브 러스트
pub fn factorial(n: u128) -> u128 {
match n {
0 => 1,
n => n * factorial(n - 1),
}
}
이 코드에 대해 단순히 벤치마크를 돌려보자.
#![feature(test)]
extern crate test;
#[bench]
fn bench_factorial(b: &mut test::Bencher) {
b.iter(|| {
let result = factorial(15);
assert_eq!(result, 1_307_674_368_000);
});
}
다음과 같이 긍정적인 결과가 나온다.
test bench_factorial ... bench: 0 ns/iter (+/- 0)
입력을 고정시키고 테스트할 코드의 양을 줄이면, 컴파일러는 반복문을 제거하고 결과를 직접
출력하는 방식으로 최적화하기 때문에 비현실적으로 긍정적인 결과가 나온 것이다.
일종의 항등 함수
identity
function
인
std
::
hint
::
black
_
box
를 사용하면 이 문제를 해결할 수 있
다. 컴파일러는 이 함수의 구현 코드를 최적화하지 않도록 권고하는데, 그렇다고
최적화가 절대
안 되는 것은 아니다
.
이를 반영해 벤치마크 코드의 위치를 다음과 같이 옮긴다.
#[bench]
fn bench_factorial(b: ...