34 #include <gtest/gtest.h> 40 TEST(BlockmemGridmap, SpacialAccessPerformance)
42 constexpr
int size[3] = {0x420, 0x420, 0x28};
43 constexpr
int pad[3] = {0x204, 0x204, 0x10};
44 constexpr
int range = 0x10;
45 constexpr
int repeat = 4;
51 using ThreeDimArrayFloat = std::array<std::array<std::array<float, size[0]>, size[1]>, size[2]>;
54 std::shared_ptr<ThreeDimArrayFloat> array_ptr(
new ThreeDimArrayFloat);
55 std::shared_ptr<ThreeDimArrayFloat> array_ret_ptr(
new ThreeDimArrayFloat);
56 ThreeDimArrayFloat& array = *array_ptr;
57 ThreeDimArrayFloat& array_ret = *array_ret_ptr;
59 gm.
reset(
Vec(size[0], size[1], size[2]));
60 gm_ret.
reset(
Vec(size[0], size[1], size[2]));
64 for (i[0] = 0; i[0] < size[0]; ++i[0])
66 for (i[1] = 0; i[1] < size[1]; ++i[1])
68 for (i[2] = 0; i[2] < size[2]; ++i[2])
70 gm[i] = i[2] * 0x100 + i[1] * 0x10 + i[0];
71 array[i[2]][i[1]][i[0]] = gm[i];
76 for (i[0] = pad[0]; i[0] < size[0] - pad[0]; ++i[0])
78 for (i[1] = pad[1]; i[1] < size[1] - pad[1]; ++i[1])
80 for (i[2] = pad[2]; i[2] < size[2] - pad[2]; ++i[2])
82 ASSERT_EQ(gm[i], array[i[2]][i[1]][i[0]]);
86 boost::chrono::duration<float> d0;
87 boost::chrono::duration<float> d1;
89 for (
int r = 0; r < repeat; ++r)
92 const auto ts0 = boost::chrono::high_resolution_clock::now();
93 for (i[0] = pad[0]; i[0] < size[0] - pad[0]; ++i[0])
95 for (i[1] = pad[1]; i[1] < size[1] - pad[1]; ++i[1])
97 for (i[2] = pad[2]; i[2] < size[2] - pad[2]; ++i[2])
102 for (j[0] = -range; j[0] <= range; ++j[0])
104 for (j[1] = -range; j[1] <= range; ++j[1])
106 for (j[2] = -range; j[2] <= range; ++j[2])
108 const Vec ij = i + j;
118 std::cerr << std::endl;
119 const auto te0 = boost::chrono::high_resolution_clock::now();
120 d0 += boost::chrono::duration<float>(te0 - ts0);
123 const auto ts1 = boost::chrono::high_resolution_clock::now();
124 for (i[0] = pad[0]; i[0] < size[0] - pad[0]; ++i[0])
126 for (i[1] = pad[1]; i[1] < size[1] - pad[1]; ++i[1])
128 for (i[2] = pad[2]; i[2] < size[2] - pad[2]; ++i[2])
131 array_ret[i[2]][i[1]][i[0]] = 0;
133 for (j[0] = -range; j[0] <= range; ++j[0])
135 for (j[1] = -range; j[1] <= range; ++j[1])
137 for (j[2] = -range; j[2] <= range; ++j[2])
139 const Vec ij = i + j;
140 array_ret[i[2]][i[1]][i[0]] += array[ij[2]][ij[1]][ij[0]];
141 array[ij[2]][ij[1]][ij[0]]++;
149 std::cerr << std::endl;
150 const auto te1 = boost::chrono::high_resolution_clock::now();
151 d1 += boost::chrono::duration<float>(te1 - ts1);
153 std::cout <<
"BlockMemGridmap<3, 2>: " << d0.count() << std::endl;
154 std::cout <<
"Array[][][]: " << d1.count() << std::endl;
157 for (i[0] = pad[0]; i[0] < size[0] - pad[0]; ++i[0])
159 for (i[1] = pad[1]; i[1] < size[1] - pad[1]; ++i[1])
161 for (i[2] = pad[2]; i[2] < size[2] - pad[2]; ++i[2])
163 ASSERT_EQ(gm_ret[i], array_ret[i[2]][i[1]][i[0]]);
169 std::cout <<
"Improvement ratio: " << d1.count() / d0.count() << std::endl;
174 int main(
int argc,
char** argv)
176 testing::InitGoogleTest(&argc, argv);
178 return RUN_ALL_TESTS();
void reset(const CyclicVecInt< DIM, NONCYCLIC > &size)
TEST(BlockmemGridmap, BlockWidth)
MotionPrimitiveBuilder::Vec Vec