basic benchmark

This commit is contained in:
Robin Appelman 2020-05-02 14:15:25 +02:00
commit d3765674d4
3 changed files with 29 additions and 6 deletions

20
benches/bench.rs Normal file
View file

@ -0,0 +1,20 @@
#![feature(test)]
extern crate test;
use std::fs;
use bitbuffer::{BitReadBuffer, BitReadStream, LittleEndian};
use sourcenav::get_area_tree;
use std::fs::read;
use test::Bencher;
#[bench]
fn bench_badwater(b: &mut Bencher) {
let file = read("data/pl_badwater.nav").unwrap();
let data = BitReadStream::new(BitReadBuffer::new(file, LittleEndian));
b.iter(|| {
test::black_box(get_area_tree(data.clone()));
})
}

View file

@ -6,6 +6,7 @@ pub use crate::navmesh::{
use crate::parser::read_areas; use crate::parser::read_areas;
pub use crate::parser::{NavArea, ParseError}; pub use crate::parser::{NavArea, ParseError};
use aabb_quadtree::{ItemId, QuadTree}; use aabb_quadtree::{ItemId, QuadTree};
use bitbuffer::{BitReadStream, LittleEndian};
use euclid::{TypedPoint2D, TypedRect, TypedSize2D}; use euclid::{TypedPoint2D, TypedRect, TypedSize2D};
mod navmesh; mod navmesh;
@ -29,8 +30,8 @@ pub struct NavTree(QuadTree<NavArea, HammerUnit, [(ItemId, Rect); 4]>);
/// # Ok(()) /// # Ok(())
/// # } /// # }
/// ``` /// ```
pub fn get_area_tree(data: Vec<u8>) -> Result<NavTree, ParseError> { pub fn get_area_tree(data: impl Into<BitReadStream<LittleEndian>>) -> Result<NavTree, ParseError> {
let areas = read_areas(data)?; let areas = read_areas(data.into())?;
let (min_x, min_y, max_x, max_y) = areas.iter().fold( let (min_x, min_y, max_x, max_y) = areas.iter().fold(
(f32::MAX, f32::MAX, f32::MIN, f32::MIN), (f32::MAX, f32::MAX, f32::MIN, f32::MIN),

View file

@ -1,5 +1,5 @@
pub use crate::navmesh::NavArea; pub use crate::navmesh::NavArea;
use bitbuffer::{BitReadBuffer, BitReadStream, LittleEndian}; use bitbuffer::{BitReadStream, LittleEndian};
use err_derive::Error; use err_derive::Error;
/// Errors that can occur when parsing the binary nav file /// Errors that can occur when parsing the binary nav file
@ -19,8 +19,9 @@ pub enum ParseError {
UnsupportedVersion(u32), UnsupportedVersion(u32),
} }
pub(crate) fn read_areas(data: Vec<u8>) -> Result<Vec<NavArea>, ParseError> { pub(crate) fn read_areas(
let mut data = BitReadStream::new(BitReadBuffer::new(data, LittleEndian)); mut data: BitReadStream<LittleEndian>,
) -> Result<Vec<NavArea>, ParseError> {
let magic = data.read()?; let magic = data.read()?;
if magic != 0xFEED_FACE { if magic != 0xFEED_FACE {
return Err(ParseError::InvalidMagicNumber(magic)); return Err(ParseError::InvalidMagicNumber(magic));
@ -146,6 +147,7 @@ pub(crate) fn read_areas(data: Vec<u8>) -> Result<Vec<NavArea>, ParseError> {
#[test] #[test]
fn test() { fn test() {
let file = std::fs::read("data/pl_badwater.nav").unwrap(); let file = std::fs::read("data/pl_badwater.nav").unwrap();
let areas = read_areas(file).unwrap(); let data = BitReadStream::new(bitbuffer::BitReadBuffer::new(file, LittleEndian));
let areas = read_areas(data).unwrap();
assert_eq!(1930, areas.len()); assert_eq!(1930, areas.len());
} }