Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Arraylist, fast new container to add front and back (opentibiab…
…r#1677) Arraylist is a very fast container for adding to the front and back, it uses two vectors to do this juggling and doesn't allow you to remove the front, as it is slow, use std::list for this case. **Benchmark** loop: 99999 ![image](https://github.com/opentibiabr/canary/assets/2267386/ebdc1883-0249-413a-8553-8c5dab0b7ac8) loop: 999999 ![image](https://github.com/opentibiabr/canary/assets/2267386/6d0c46b3-ff6e-429a-8ae7-9cf015ed142e) <details> ```c++ constexpr size_t LOOP = 999999; Benchmark bm; for (size_t i = 0; i < 999; i++) { stdext::arraylist<uint32_t> list; list.reserve(LOOP); for (size_t d = 0; d < LOOP; d++) { if (d % 2) { list.emplace_front(d); } else { list.emplace_back(d); } } for (const auto &v : list) { } } g_logger().info("stdext::arraylist + reserve: {}ms", bm.duration()); bm.reset(); bm.start(); for (size_t i = 0; i < 999; i++) { stdext::arraylist<uint32_t> list; for (size_t d = 0; d < LOOP; d++) { if (d % 2) { list.emplace_front(d); } else { list.emplace_back(d); } } for (const auto &v : list) { } } g_logger().info("stdext::arraylist: {}ms", bm.duration()); bm.reset(); bm.start(); for (size_t i = 0; i < 999; i++) { std::list<uint32_t> list; for (size_t d = 0; d < LOOP; d++) { if (d % 2) { list.emplace_front(d); } else { list.emplace_back(d); } } for (const auto &v : list) { } } g_logger().info("std::list: {}ms", bm.duration()); bm.reset(); bm.start(); for (size_t i = 0; i < 999; i++) { std::deque<uint32_t> list; for (size_t d = 0; d < LOOP; d++) { if (d % 2) { list.emplace_front(d); } else { list.emplace_back(d); } } for (const auto &v : list) { } } g_logger().info("std::deque: {}ms", bm.duration()); g_logger().info("--- stdext::arraylist vs std::forward_list vs std::list vs std::deque --- (push_front)"); bm.reset(); bm.start(); for (size_t i = 0; i < 999; i++) { stdext::arraylist<uint32_t> list; list.reserve(LOOP); for (size_t d = 0; d < LOOP; d++) { list.emplace_front(d); } for (const auto &v : list) { } } g_logger().info("stdext::arraylist + reserve: {}ms", bm.duration()); bm.reset(); bm.start(); for (size_t i = 0; i < 999; i++) { stdext::arraylist<uint32_t> arraylist; for (size_t d = 0; d < LOOP; d++) { arraylist.emplace_front(d); } for (const auto &v : arraylist) { } } g_logger().info("stdext::arraylist: {}ms", bm.duration()); bm.reset(); bm.start(); for (size_t i = 0; i < 999; i++) { std::forward_list<uint32_t> list; for (size_t d = 0; d < LOOP; d++) { list.emplace_front(d); } for (const auto &v : list) { } } g_logger().info("std::forward_list: {}ms", bm.duration()); bm.reset(); bm.start(); for (size_t i = 0; i < 999; i++) { std::list<uint32_t> list; for (size_t d = 0; d < LOOP; d++) { list.emplace_front(d); } for (const auto &v : list) { } } g_logger().info("std::list: {}ms", bm.duration()); bm.reset(); bm.start(); for (size_t i = 0; i < 999; i++) { std::deque<uint32_t> list; for (size_t d = 0; d < LOOP; d++) { list.emplace_front(d); } for (const auto &v : list) { } } g_logger().info("std::deque: {}ms", bm.duration()); ``` </details> **Validating Content** <details> ```c++ constexpr size_t LOOP = 999999; stdext::arraylist<uint32_t> arraylist; arraylist.reserve(LOOP); for (size_t d = 0; d < LOOP; d++) { if (d % 2) { arraylist.emplace_front(d); } else { arraylist.emplace_back(d); } } std::deque<uint32_t> deque; for (size_t d = 0; d < LOOP; d++) { if (d % 2) { deque.emplace_front(d); } else { deque.emplace_back(d); } } for (size_t i = 0; i < LOOP; i++) { if (arraylist[i] != deque[i]) { g_logger().info("NOT EQUAL"); } } g_logger().info("FINISHED"); ``` </details>
- Loading branch information