From ca14a93f6f3f1f2150de7afb0e5ca2485a1aff87 Mon Sep 17 00:00:00 2001 From: Richard Thier Date: Wed, 28 Aug 2024 12:35:25 +0200 Subject: [PATCH] mmap-based paging based solutions which seem pretty fast actually - funny enough --- main.cpp | 166 +++++++++++++++++++++++++++++++++++++++++++++------- turbolist.h | 6 +- 2 files changed, 148 insertions(+), 24 deletions(-) diff --git a/main.cpp b/main.cpp index 9aa1c5a..297e634 100644 --- a/main.cpp +++ b/main.cpp @@ -4,13 +4,15 @@ #include #include #include +#include #include"TurboList.hpp" #include"turbolist.h" -#include +#include"arena.h" // #define PRINT_DBG // #define N 65535 -#define N 65535000 +// #define N 65535000 +#define N 65535*100 static inline size_t ms_now() noexcept { auto now = std::chrono::system_clock::now(); @@ -28,36 +30,75 @@ int main() { // std::vector // - std::vector vec; - auto before_vector = ms_now(); - for(int i = 0; i < N; ++i) { - vec.push_back(i); + { + auto before_vector = ms_now(); + std::vector vec; + std::vector vec1; + std::vector vec2; + std::vector vec3; + std::vector vec4; + std::vector vec5; + std::vector vec6; + std::vector vec7; + std::vector vec8; + std::vector vec9; + for(int i = 0; i < N; ++i) { + vec.push_back(i); + vec1.push_back(i); + vec2.push_back(i); + vec3.push_back(i); + vec4.push_back(i); + vec5.push_back(i); + vec6.push_back(i); + vec7.push_back(i); + vec8.push_back(i); + vec9.push_back(i); + } + auto after_vector = ms_now(); + printt("vector", before_vector, after_vector); } - auto after_vector = ms_now(); - printt("vector", before_vector, after_vector); // TurboList // - TurboList list; - - auto before_TurboList = ms_now(); - for(int i = 0; i < N; ++i) { - list.insert(i); - } - auto after_TurboList = ms_now(); - printt("TurboList", before_TurboList, after_TurboList); + { + auto before_TurboList = ms_now(); + TurboList list; + TurboList list1; + TurboList list2; + TurboList list3; + TurboList list4; + TurboList list5; + TurboList list6; + TurboList list7; + TurboList list8; + TurboList list9; + for(int i = 0; i < N; ++i) { + list.insert(i); + list1.insert(i); + list2.insert(i); + list3.insert(i); + list4.insert(i); + list5.insert(i); + list6.insert(i); + list7.insert(i); + list8.insert(i); + list9.insert(i); + } + auto after_TurboList = ms_now(); + printt("TurboList", before_TurboList, after_TurboList); #ifdef PRINT_DBG - for(int i = 0; i < list.size(); ++i) { - printf("%d\n", list[i]); + for(int i = 0; i < list.size(); ++i) { + printf("%d\n", list[i]); + } +#endif // PRINT_DBG } -#endif /* PRINT_DBG */ // C turbolist // - turbolist clist = turbolist_create(); - + /* auto before_cturbolist = ms_now(); + turbolist clist = turbolist_create(); for(int i = 0; i < N; ++i) { turbolist_insert(&clist, i); } @@ -68,6 +109,89 @@ int main() { for(int i = 0; i < turbolist_size(clist); ++i) { printf("%d\n", turbolist_get(clist, i)); } +#endif // PRINT_DBG + + turbolist_delete(&clist); + + // C arena turbolist // + + { + auto before_carenaturbolist = ms_now(); + turbolist clist = turbolist_create_adv( + // malloc-like + [](size_t size) { + static thread_local arena a = newarena((ptrdiff_t)1 << 33); + return (void*) alloc(&a, sizeof(uint8_t), sizeof(uint8_t), size); + }, + // free-like + [](void *ptr) {}, + // initial size + 0, + // initial cap + 16 + ); + for(int i = 0; i < N; ++i) { + turbolist_insert(&clist, i); + } + auto after_carenaturbolist = ms_now(); + printt("C arena turbolist", before_carenaturbolist, after_carenaturbolist); + +#ifdef PRINT_DBG + for(int i = 0; i < turbolist_size(clist); ++i) { + printf("%d\n", turbolist_get(clist, i)); + } +#endif // PRINT_DBG + + turbolist_delete(&clist); + } + */ + + // C ARENA // + + auto before_arena = ms_now(); + arena a = newarena((ptrdiff_t)1 << 33); + arena a1 = newarena((ptrdiff_t)1 << 33); + arena a2 = newarena((ptrdiff_t)1 << 33); + arena a3 = newarena((ptrdiff_t)1 << 33); + arena a4 = newarena((ptrdiff_t)1 << 33); + arena a5 = newarena((ptrdiff_t)1 << 33); + arena a6 = newarena((ptrdiff_t)1 << 33); + arena a7 = newarena((ptrdiff_t)1 << 33); + arena a8 = newarena((ptrdiff_t)1 << 33); + arena a9 = newarena((ptrdiff_t)1 << 33); + // steps at first real elem, there should be N from here! + int *arenalist = ((int*)alloc(&a, sizeof(int), sizeof(int), 1)) + 1; + for(int i = 0; i < N; ++i) { + int *value = (int*)alloc(&a, sizeof(int), sizeof(int), 1); + *value = i; + + value = (int*)alloc(&a1, sizeof(int), sizeof(int), 1); + *value = i; + value = (int*)alloc(&a2, sizeof(int), sizeof(int), 1); + *value = i; + value = (int*)alloc(&a3, sizeof(int), sizeof(int), 1); + *value = i; + value = (int*)alloc(&a4, sizeof(int), sizeof(int), 1); + *value = i; + value = (int*)alloc(&a5, sizeof(int), sizeof(int), 1); + *value = i; + value = (int*)alloc(&a6, sizeof(int), sizeof(int), 1); + *value = i; + value = (int*)alloc(&a7, sizeof(int), sizeof(int), 1); + *value = i; + value = (int*)alloc(&a8, sizeof(int), sizeof(int), 1); + *value = i; + value = (int*)alloc(&a9, sizeof(int), sizeof(int), 1); + *value = i; + } + auto after_arena = ms_now(); + printt("C arena", before_arena, after_arena); + +#ifdef PRINT_DBG + // Rem.: You can collect up size on insertion if needed... + for(int i = 0; i < N; ++i) { + printf("%d\n", arenalist[i]); + } #endif /* PRINT_DBG */ return 0; diff --git a/turbolist.h b/turbolist.h index d4e7732..b410319 100644 --- a/turbolist.h +++ b/turbolist.h @@ -42,7 +42,7 @@ static TL_NOINLINE void __turbolist_grow_and_insert(turbolist *tl, int elem) { turbolist_insert(tl, elem); } -static inline turbolist turbolist_create_adv(void* (*malloc_like)(size_t size), void (*free_like)(void*), uint32_t initial_size = 0, uint32_t initial_cap = 16) { +static inline turbolist turbolist_create_adv(void* (*malloc_like)(size_t size), void (*free_like)(void*), uint32_t initial_size, uint32_t initial_cap) { assert(initial_size <= initial_cap); turbolist tl; @@ -57,8 +57,8 @@ static inline turbolist turbolist_create_adv(void* (*malloc_like)(size_t size), } #ifndef NO_CSTDLIB -static inline turbolist turbolist_create(uint32_t initial_size = 0, uint32_t initial_cap = 16) { - return turbolist_create_adv(malloc, free, initial_size, initial_cap); +static inline turbolist turbolist_create() { + return turbolist_create_adv(malloc, free, 0, 16); } #endif /* NO_CSTDLIB */