lean4-htt/src/util/memory_pool.h
Leonardo de Moura cad379333d feat(util/memory_pool): put limit on the size of memory_pool free_lists
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
2017-02-28 15:16:43 -08:00

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); \
}
}