Browse Source
Example run: ``` $ tools/build_and_run_benchmark.py path_benchmark -------------------------------------------------------- Benchmark Time CPU Iterations -------------------------------------------------------- BM_SinglePath 2905 ns 2905 ns 241038 BM_Bridges 65951 ns 65948 ns 9785 BM_NoPath 131397 ns 131390 ns 5247 ```pull/7521/merge
2 changed files with 126 additions and 1 deletions
@ -0,0 +1,122 @@
|
||||
#include <cstdint> |
||||
|
||||
#include <benchmark/benchmark.h> |
||||
#include <utility> |
||||
|
||||
#include "engine/path.h" |
||||
#include "engine/point.hpp" |
||||
#include "engine/points_in_rectangle_range.hpp" |
||||
#include "engine/size.hpp" |
||||
|
||||
namespace devilution { |
||||
namespace { |
||||
|
||||
struct Map { |
||||
Size size; |
||||
const char *data; |
||||
char operator[](const Point &p) const { return data[p.y * size.width + p.x]; } |
||||
}; |
||||
|
||||
std::pair<Point, Point> FindStartDest(const Map &m) |
||||
{ |
||||
Point start, dest; |
||||
for (Point p : PointsInRectangle(Rectangle(Point { 0, 0 }, m.size))) { |
||||
switch (m[p]) { |
||||
case 'S': |
||||
start = p; |
||||
break; |
||||
case 'E': |
||||
dest = p; |
||||
break; |
||||
} |
||||
} |
||||
return { start, dest }; |
||||
} |
||||
|
||||
void BenchmarkMap(const Map &map, benchmark::State &state) |
||||
{ |
||||
const auto [start, dest] = FindStartDest(map); |
||||
const auto posOk = /*posOk=*/[&map](Point p) { return map[p] != '#'; }; |
||||
for (auto _ : state) { |
||||
int8_t path[MaxPathLength]; |
||||
int result = FindPath(/*canStep=*/[](Point, Point) { return true; }, |
||||
posOk, start, dest, path); |
||||
benchmark::DoNotOptimize(result); |
||||
} |
||||
} |
||||
|
||||
void BM_SinglePath(benchmark::State &state) |
||||
{ |
||||
BenchmarkMap( |
||||
Map { |
||||
Size { 15, 15 }, |
||||
"###############" |
||||
"#...#...#.....#" |
||||
"#.#.#.#.#.###.#" |
||||
"#S#...#.#.#...#" |
||||
"#######.#.#.###" |
||||
"##...##.#.#E..#" |
||||
"#######.#.###.#" |
||||
"###...#...#...#" |
||||
"###.#######.###" |
||||
"#...###...#...#" |
||||
"#.#####.#.###.#" |
||||
"#.#...#.#.#...#" |
||||
"#.#.#.#.#.#.###" |
||||
"#...#...#...###" |
||||
"###############" }, |
||||
state); |
||||
} |
||||
|
||||
void BM_Bridges(benchmark::State &state) |
||||
{ |
||||
BenchmarkMap( |
||||
Map { |
||||
Size { 15, 15 }, |
||||
"###############" |
||||
"#.S...........#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"############.##" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"###.###########" |
||||
"#.....E.......#" |
||||
"###############" }, |
||||
state); |
||||
} |
||||
|
||||
void BM_NoPath(benchmark::State &state) |
||||
{ |
||||
BenchmarkMap( |
||||
Map { |
||||
Size { 15, 15 }, |
||||
"###############" |
||||
"#.S...........#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"#.............#" |
||||
"###############" |
||||
"#.....E.......#" |
||||
"###############" }, |
||||
state); |
||||
} |
||||
|
||||
BENCHMARK(BM_SinglePath); |
||||
BENCHMARK(BM_Bridges); |
||||
BENCHMARK(BM_NoPath); |
||||
|
||||
} // namespace
|
||||
} // namespace devilution
|
||||
Loading…
Reference in new issue