| /* |
| * Copyright 2022 Rive |
| */ |
| |
| #include "bench.hpp" |
| |
| #include "rive/math/raw_path.hpp" |
| |
| using namespace rive; |
| |
| static void map(const Mat2D& m, |
| std::vector<Vec2D>& dst, |
| const std::vector<Vec2D>& pts) |
| { |
| size_t n = pts.size(); |
| #if 0 |
| // Scalar implementation. |
| for (size_t i = 0; i < n; ++i) |
| dst[i] = m * pts[i]; |
| #else |
| // Vector implementation. |
| m.mapPoints(dst.data(), pts.data(), n); |
| #endif |
| } |
| |
| // Measure the speed of Mat2D::mapPoints(). |
| class MapPoints : public Bench |
| { |
| public: |
| MapPoints(const Mat2D& matrix) : m_matrix(matrix) |
| { |
| m_points.resize(32768 / sizeof(Vec2D)); // 32k so we fit in L1. |
| srand(0); |
| for (Vec2D& pt : m_points) |
| pt = Vec2D(float(rand()), float(rand())) * 100 / (float)RAND_MAX; |
| m_dst.resize(m_points.size()); |
| } |
| |
| private: |
| int run() const override |
| { |
| map(m_matrix, m_dst, m_points); |
| for (int i = 1; i < 4096; ++i) |
| map(m_matrix, m_dst, m_dst); |
| return static_cast<int>(m_dst.back().x); |
| } |
| |
| Mat2D m_matrix; |
| std::vector<Vec2D> m_points; |
| mutable std::vector<Vec2D> m_dst; |
| }; |
| |
| class MapPointsScaleTrans : public MapPoints |
| { |
| public: |
| MapPointsScaleTrans() : MapPoints(Mat2D(-2, 0, 0, 3, -4, 5)) {} |
| }; |
| |
| class MapPointsAffine : public MapPoints |
| { |
| public: |
| MapPointsAffine() : MapPoints(Mat2D(2, -3, -4, 5, 6, -7)) {} |
| }; |
| |
| REGISTER_BENCH(MapPointsScaleTrans); |
| REGISTER_BENCH(MapPointsAffine); |