Edit: The test code I used
template <typename FN> void measure_exec(const char* name, FN f) { auto start = std::chrono::steady_clock::now(); f(); auto t = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - start); std::cout << name << " took " << t.count() << "ms." << std::endl; } struct message { int id; double timestamp; }; int main(void) { std::srand(std::time(nullptr)); std::vector<message*> control; std::vector<message*> test; measure_exec("Pool", [&]{ mem::pool<message> pool{ 32, true }; for (uint64 i = 0; i < 200000; ++i) { if (i % 15) { // Allocate int r_id = std::rand(); double r_time = double(std::rand()) / std::rand(); auto t = pool.alloc(); t->id = r_id; t->timestamp = r_time; test.push_back(t); } else if (control.size()) { // Delete uint64 idx = std::rand() % control.size(); test.erase(test.begin() + idx); } } }); measure_exec("New", [&]{ for (uint64 i = 0; i < 200000; ++i) { if (i % 15) { // Allocate int r_id = std::rand(); double r_time = double(std::rand()) / std::rand(); control.push_back(new message{ r_id, r_time }); } else if (control.size()) { // Delete uint64 idx = std::rand() % control.size(); control.erase(control.begin() + idx); } } }); std::cin.get(); return 0; } Note that I haven't really tested anything like this before, this testing method was a complete shot in the dark. I know because of randomness it can be unfair but repeating the test yielded similar results. Yes I know I don't free memory but I don't think it matters that much.