See #1405 Memory consumption is still high, but I didn't manage to cross the 2Gb limit anymore with this commit even after hundreds of modifications. @gebner I'm not seeing a big difference betwee Lean without memory_pool, with bounded memory_pool and unbounded memory_pool. We may even consider removing it in the future after a more careful benchmarking. In the benchmark (https://gist.github.com/leodemoura/b27fb4203a13a67274b388a602149303), I'm getting the following numbers: - No memory_pool: runtimes between 3.532s - 3.556s - With memory_pool bounded by 8192: runtimes between 3.32s - 3.44s - With memory_pool (with no limit): runtimes between 3.32s - 3.44s On the other hand, the small object allocator makes a big difference. I used your list_rev.lean example. - with: 2.62s - without: 3.75s
46 lines
1.3 KiB
C++
46 lines
1.3 KiB
C++
/*
|
|
Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
|
|
Author: Leonardo de Moura
|
|
*/
|
|
#pragma once
|
|
#include "util/memory.h"
|
|
|
|
#define LEAN_FREE_LIST_MAX_SIZE 8192
|
|
|
|
namespace lean {
|
|
/** \brief Auxiliary object for "recycling" allocated memory of fixed size */
|
|
class memory_pool {
|
|
unsigned m_size;
|
|
unsigned m_free_list_size;
|
|
void * m_free_list;
|
|
public:
|
|
memory_pool(unsigned size):m_size(size), m_free_list_size(0), m_free_list(nullptr) {}
|
|
~memory_pool();
|
|
void * allocate();
|
|
void recycle(void * ptr) {
|
|
#ifdef LEAN_NO_CUSTOM_ALLOCATORS
|
|
free(ptr);
|
|
#else
|
|
if (m_free_list_size > LEAN_FREE_LIST_MAX_SIZE) {
|
|
free(ptr);
|
|
} else {
|
|
*(reinterpret_cast<void**>(ptr)) = m_free_list;
|
|
m_free_list = ptr;
|
|
m_free_list_size++;
|
|
}
|
|
#endif
|
|
}
|
|
};
|
|
|
|
memory_pool * allocate_thread_memory_pool(unsigned sz);
|
|
|
|
#define DEF_THREAD_MEMORY_POOL(NAME, SZ) \
|
|
LEAN_THREAD_PTR(memory_pool, NAME ## _tlocal); \
|
|
memory_pool & NAME() { \
|
|
if (!NAME ## _tlocal) \
|
|
NAME ## _tlocal = allocate_thread_memory_pool(SZ); \
|
|
return *(NAME ## _tlocal); \
|
|
}
|
|
}
|