summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-06-04 10:10:28 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-06-04 10:10:28 +0000
commitfbe7528360ec97aacd145fe9fef0d4aff4a1f43f (patch)
tree10ebba3f9e45862314f39efc0651b02022fff840 /vespalib
parente6088b4fe9fa52da6cf4fd771050da1c61c83e0a (diff)
Add benchmark for non POD objects.
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/stllike/hashtable_test.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/vespalib/src/tests/stllike/hashtable_test.cpp b/vespalib/src/tests/stllike/hashtable_test.cpp
index 5f6f1601c84..aaecbb3833d 100644
--- a/vespalib/src/tests/stllike/hashtable_test.cpp
+++ b/vespalib/src/tests/stllike/hashtable_test.cpp
@@ -5,9 +5,9 @@
#include <vespa/vespalib/stllike/hash_fun.h>
#include <vespa/vespalib/stllike/identity.h>
#include <vespa/vespalib/testkit/testapp.h>
+#include <vespa/vespalib/stllike/hash_map.hpp>
#include <memory>
#include <vector>
-#include <vespa/vespalib/stllike/hash_map.h>
using vespalib::hashtable;
using std::vector;
@@ -141,7 +141,7 @@ TEST("require that hashtable<vector<int>> can be copied") {
* 2 - test - 6.6s hash_node() : _next(invalid) { memset(_node, 0, sizeof(node)); }
* 3 - current - 2.3s hash_node() : _next(invalid) {}
*/
-TEST("benchmark clear") {
+TEST("benchmark hash table reconstruction with POD objects") {
vespalib::hash_map<uint32_t, uint32_t> m(1000000);
constexpr size_t NUM_ITER = 10; // Set to 1k-10k to get measurable numbers 10k ~= 2.3s
for (size_t i(0); i < NUM_ITER; i++) {
@@ -155,6 +155,32 @@ TEST("benchmark clear") {
}
}
+class NonPOD {
+public:
+ NonPOD() : _v(rand()) {}
+ ~NonPOD() { _v = 0; }
+private:
+ uint32_t _v;
+};
+
+/**
+ * Performance is identical for NonPOD objects as with POD object.
+ * Object are are only constructed on insert, and destructed on erase/clear.
+ */
+TEST("benchmark hash table reconstruction with POD objects") {
+ vespalib::hash_map<uint32_t, NonPOD> m(1000000);
+ constexpr size_t NUM_ITER = 10; // Set to 1k-10k to get measurable numbers 10k ~= 2.3s
+ for (size_t i(0); i < NUM_ITER; i++) {
+ m[46] = NonPOD();
+ EXPECT_FALSE(m.empty());
+ EXPECT_EQUAL(1u, m.size());
+ EXPECT_EQUAL(1048576u, m.capacity());
+ m.clear();
+ EXPECT_TRUE(m.empty());
+ EXPECT_EQUAL(1048576u, m.capacity());
+ }
+}
+
} // namespace
TEST_MAIN() { TEST_RUN_ALL(); }