diff --git a/Makefile b/Makefile index 4d34b940..b9dac358 100644 --- a/Makefile +++ b/Makefile @@ -7,4 +7,4 @@ crc32c.o: crc32c.c %.o: %.cpp blockstore.h g++ -Wall -Wno-sign-compare -Wno-parentheses -c -o $@ $< test: test.cpp - g++ -o test -luring test.cpp + g++ -O3 -o test -luring test.cpp diff --git a/blockstore.h b/blockstore.h index bdb0fb8f..34917e30 100644 --- a/blockstore.h +++ b/blockstore.h @@ -13,7 +13,6 @@ #include #include -#include #include #include #include @@ -226,7 +225,7 @@ private: uint64_t min_used_journal_sector, max_used_journal_sector; // Sync - std::deque sync_big_writes, sync_small_writes; + std::vector sync_big_writes, sync_small_writes; std::list::iterator in_progress_ptr; int sync_state, prev_sync_count; }; @@ -241,7 +240,7 @@ class blockstore spp::sparse_hash_map clean_db; std::map dirty_db; std::list submit_queue; - std::deque unsynced_big_writes, unsynced_small_writes; + std::vector unsynced_big_writes, unsynced_small_writes; std::list in_progress_syncs; uint32_t block_order, block_size; uint64_t block_count; diff --git a/blockstore_stable.cpp b/blockstore_stable.cpp index 892e7392..db2b9ec1 100644 --- a/blockstore_stable.cpp +++ b/blockstore_stable.cpp @@ -124,6 +124,7 @@ void blockstore::handle_stable_event(ring_data_t *data, blockstore_operation *op { // First step: mark dirty_db entries as stable, acknowledge op completion // FIXME: oops... we seem to have to copy object id/version pairs... + // No, no, no, copying is bad. We don't want copying. obj_ver_id* v; int i; for (i = 0, v = (obj_ver_id*)op->buf; i < op->len; i++, v++) diff --git a/test.cpp b/test.cpp index 66737567..3906c496 100644 --- a/test.cpp +++ b/test.cpp @@ -14,6 +14,11 @@ #include #include +#include +#include + +#include "blockstore.h" +#include "cpp-btree/btree_map.h" static int setup_context(unsigned entries, struct io_uring *ring) { @@ -47,7 +52,76 @@ static void test_write(struct io_uring *ring, int fd) free(buf); } +class obj_ver_hash +{ +public: + size_t operator()(const obj_ver_id &s) const + { + size_t seed = 0; + spp::hash_combine(seed, s.oid.inode); + spp::hash_combine(seed, s.oid.stripe); + spp::hash_combine(seed, s.version); + return seed; + } +}; + +inline bool operator == (const obj_ver_id & a, const obj_ver_id & b) +{ + return a.oid == b.oid && a.version == b.version; +} + int main(int argc, char *argv[]) +{ + // std::map 5M entries -> 2.115s + // btree_map 5M entries -> 0.458s + // sparse_hash_map 5M entries -> 2.193s + //btree::btree_map dirty_db; + //std::map dirty_db; + spp::sparse_hash_map dirty_db; + for (int i = 0; i < 5000000; i++) + { + dirty_db[(obj_ver_id){ + .oid = (object_id){ + .inode = 1, + .stripe = i, + }, + .version = 1, + }] = (dirty_entry){ + .state = ST_D_META_SYNCED, + .flags = 0, + .location = i << 17, + .offset = 0, + .size = 1 << 17, + }; + } + return 0; +} + +int main1(int argc, char *argv[]) +{ + std::vector v1, v2; + v1.reserve(10000); + v2.reserve(10000); + for (int i = 0; i < 10000; i++) + { + v1.push_back(i); + v2.push_back(i); + } + for (int i = 0; i < 100000; i++) + { + // haha (core i5-2500 | i7-6800HQ) + // vector 10000 items: 4.37/100000 | 3.66 + // vector 100000 items: 9.68/10000 | 0.95 + // deque 10000 items: 28.432/100000 + // list 10000 items: 320.695/100000 + std::vector v3; + v3.insert(v3.end(), v1.begin(), v1.end()); + v3.insert(v3.end(), v2.begin(), v2.end()); + } + return 0; +} + +int main2(int argc, char *argv[]) { std::map strs; strs.emplace(12, "str");