forked from vitalif/vitastor
Do not use deque, test cpp-btree
parent
46e96c5128
commit
71552adf79
2
Makefile
2
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
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <deque>
|
||||
#include <list>
|
||||
#include <set>
|
||||
#include <functional>
|
||||
|
@ -226,7 +225,7 @@ private:
|
|||
uint64_t min_used_journal_sector, max_used_journal_sector;
|
||||
|
||||
// Sync
|
||||
std::deque<obj_ver_id> sync_big_writes, sync_small_writes;
|
||||
std::vector<obj_ver_id> sync_big_writes, sync_small_writes;
|
||||
std::list<blockstore_operation*>::iterator in_progress_ptr;
|
||||
int sync_state, prev_sync_count;
|
||||
};
|
||||
|
@ -241,7 +240,7 @@ class blockstore
|
|||
spp::sparse_hash_map<object_id, clean_entry, oid_hash> clean_db;
|
||||
std::map<obj_ver_id, dirty_entry> dirty_db;
|
||||
std::list<blockstore_operation*> submit_queue;
|
||||
std::deque<obj_ver_id> unsynced_big_writes, unsynced_small_writes;
|
||||
std::vector<obj_ver_id> unsynced_big_writes, unsynced_small_writes;
|
||||
std::list<blockstore_operation*> in_progress_syncs;
|
||||
uint32_t block_order, block_size;
|
||||
uint64_t block_count;
|
||||
|
|
|
@ -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++)
|
||||
|
|
74
test.cpp
74
test.cpp
|
@ -14,6 +14,11 @@
|
|||
#include <liburing.h>
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
|
||||
#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<obj_ver_id, dirty_entry> dirty_db;
|
||||
//std::map<obj_ver_id, dirty_entry> dirty_db;
|
||||
spp::sparse_hash_map<obj_ver_id, dirty_entry, obj_ver_hash> 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<uint64_t> 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<uint64_t> 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<int, std::string> strs;
|
||||
strs.emplace(12, "str");
|
||||
|
|
Loading…
Reference in New Issue