mirror of
https://github.com/jedisct1/libsodium.git
synced 2024-12-23 20:15:19 -07:00
Use a simple memory pool for benchmarks
In the test suite, a significant amount of time is spent in memory allocations. A memory pool helps achieve more relevant results with less iterations.
This commit is contained in:
parent
77e7d88d89
commit
18d5940bc6
@ -42,6 +42,60 @@ int xmain(void);
|
|||||||
# define ITERATIONS 128
|
# define ITERATIONS 128
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
struct {
|
||||||
|
void *pnt;
|
||||||
|
size_t size;
|
||||||
|
} mempool[1024];
|
||||||
|
|
||||||
|
static size_t mempool_idx;
|
||||||
|
|
||||||
|
static __attribute__((malloc)) void *mempool_alloc(size_t size)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
if (size >= (size_t) 0x80000000 - (size_t) 0x00000fff) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
size = (size + (size_t) 0x00000fff) & ~ (size_t) 0x00000fff;
|
||||||
|
for (i = 0U; i < mempool_idx; i++) {
|
||||||
|
if (mempool[i].size >= (size | (size_t) 0x80000000)) {
|
||||||
|
mempool[i].size &= ~ (size_t) 0x80000000;
|
||||||
|
return mempool[i].pnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mempool_idx >= sizeof mempool / sizeof mempool[0]) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
mempool[mempool_idx].size = size;
|
||||||
|
return mempool[mempool_idx++].pnt = malloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mempool_free(void *pnt)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0U; i < mempool_idx; i++) {
|
||||||
|
if (mempool[i].pnt == pnt) {
|
||||||
|
if ((mempool[i].size & (size_t) 0x80000000) != (size_t) 0x0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mempool[i].size |= (size_t) 0x80000000;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
static __attribute__((malloc)) void *mempool_allocarray(size_t count, size_t size)
|
||||||
|
{
|
||||||
|
if (count > (size_t) 0U && size >= (size_t) SIZE_MAX / count) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return mempool_alloc(count * size);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define sodium_malloc(X) mempool_alloc(X)
|
||||||
|
#define sodium_free(X) mempool_free(X)
|
||||||
|
#define sodium_allocarray(X, Y) mempool_allocarray((X), (Y))
|
||||||
|
|
||||||
static unsigned long long now(void)
|
static unsigned long long now(void)
|
||||||
{
|
{
|
||||||
struct timeval tp;
|
struct timeval tp;
|
||||||
|
@ -12,6 +12,10 @@
|
|||||||
# warning The sodium_utils2 test is expected to fail with address sanitizer
|
# warning The sodium_utils2 test is expected to fail with address sanitizer
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#undef sodium_malloc
|
||||||
|
#undef sodium_free
|
||||||
|
#undef sodium_allocarray
|
||||||
|
|
||||||
__attribute__((noreturn)) static void
|
__attribute__((noreturn)) static void
|
||||||
segv_handler(int sig)
|
segv_handler(int sig)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user