CLISH  0.7.3
"Little Useful Bits Heap" Library

Overview

This library can be linked with executables to override the standard memory management provided by the system libraries. This may provide a performance and debugging advantage.

The implementation uses the heap component to control system memory and hence provides all the features available within that memory manager. (including leak detection)

VxWorks

Replaces the memPartLib.o, memLib.o and memShow.o found in the libos.a library archive.

memLib.o functions

calloc, cfree, memFindMax, memInit, memLibInit, memOptionsSet, memPartFindMax, memPartOptionsSet, memPartRealloc, memalign, realloc, valloc

memPartLib.o functions

free, malloc, memAddToPool, memPartAddToPool, memPartAlignedAlloc, memPartAlloc, memPartBlockIsValid, memPartCreate, memPartFree, memPartInit, memPartLibInit

memShow.o functions

memShow, memPartInfoGet, memParShow

POSIX

Replaces the dynamic memory functionality found in the libc.a library archive.

This implementation relies on the sbrk() function to provide memory chunks to feed the standard heap.

Functions

calloc, cfree, free, malloc, memalign, realloc, valloc

Performance

Running the unittests with this library provides the following comparisons on some test machines:

x86_64-unknown-linux-gnu

Native memory management (./test/mallocTest) lubheap memory management (./test/lubMallocTest)
       100 in          0 milliseconds
       200 in          0 milliseconds
       300 in          0 milliseconds
       400 in          0 milliseconds
       500 in          1 milliseconds
      1000 in          3 milliseconds
      2000 in          7 milliseconds
      3000 in         12 milliseconds
      4000 in         16 milliseconds
      5000 in         21 milliseconds
     10000 in         48 milliseconds
     15000 in         79 milliseconds
     20000 in        143 milliseconds
     25000 in        200 milliseconds
     30000 in        253 milliseconds
     35000 in        314 milliseconds
     40000 in        378 milliseconds
     45000 in        460 milliseconds
     50000 in        561 milliseconds
     60000 in        790 milliseconds
     70000 in       1036 milliseconds
     80000 in       1320 milliseconds
     90000 in       1653 milliseconds
    100000 in       2037 milliseconds
       100 in          0 milliseconds
       200 in          0 milliseconds
       300 in          0 milliseconds
       400 in          1 milliseconds
       500 in          1 milliseconds
      1000 in          3 milliseconds
      2000 in          6 milliseconds
      3000 in          9 milliseconds
      4000 in         11 milliseconds
      5000 in         13 milliseconds
     10000 in         37 milliseconds
     15000 in         49 milliseconds
     20000 in         61 milliseconds
     25000 in         75 milliseconds
     30000 in         89 milliseconds
     35000 in         99 milliseconds
     40000 in        113 milliseconds
     45000 in        125 milliseconds
     50000 in        138 milliseconds
     60000 in        177 milliseconds
     70000 in        203 milliseconds
     80000 in        228 milliseconds
     90000 in        254 milliseconds
    100000 in        277 milliseconds

i686-pc-linux-gnu

Native memory management (./test/mallocTest) lubheap memory management (./test/lubMallocTest)
       100 in          0 milliseconds
       200 in          0 milliseconds
       300 in          0 milliseconds
       400 in          1 milliseconds
       500 in          1 milliseconds
      1000 in          3 milliseconds
      2000 in          7 milliseconds
      3000 in         12 milliseconds
      4000 in         16 milliseconds
      5000 in         21 milliseconds
     10000 in         46 milliseconds
     15000 in         76 milliseconds
     20000 in        111 milliseconds
     25000 in        151 milliseconds
     30000 in        199 milliseconds
     35000 in        256 milliseconds
     40000 in        318 milliseconds
     45000 in        393 milliseconds
     50000 in        472 milliseconds
     60000 in        658 milliseconds
     70000 in        874 milliseconds
     80000 in       1121 milliseconds
     90000 in       1411 milliseconds
    100000 in       1745 milliseconds
       100 in          0 milliseconds
       200 in          0 milliseconds
       300 in          1 milliseconds
       400 in          1 milliseconds
       500 in          1 milliseconds
      1000 in          4 milliseconds
      2000 in          7 milliseconds
      3000 in         11 milliseconds
      4000 in         13 milliseconds
      5000 in         15 milliseconds
     10000 in         42 milliseconds
     15000 in         57 milliseconds
     20000 in         72 milliseconds
     25000 in         89 milliseconds
     30000 in        105 milliseconds
     35000 in        121 milliseconds
     40000 in        136 milliseconds
     45000 in        154 milliseconds
     50000 in        169 milliseconds
     60000 in        213 milliseconds
     70000 in        246 milliseconds
     80000 in        278 milliseconds
     90000 in        311 milliseconds
    100000 in        341 milliseconds

i686-pc-cygwin

For some reason the native memory management under cygwin is quicker. My suspcion is that there is an overhead in the sbrk() call via the cygwin sub-system which slows the lubheap implementation...

Native memory management (./test/mallocTest) lubheap memory management (./test/lubMallocTest)
       100 in          0 milliseconds
       200 in          0 milliseconds
       300 in          0 milliseconds
       400 in          0 milliseconds
       500 in          0 milliseconds
      1000 in          0 milliseconds
      2000 in          0 milliseconds
      3000 in         16 milliseconds
      4000 in         15 milliseconds
      5000 in         16 milliseconds
     10000 in         31 milliseconds
     15000 in         47 milliseconds
     20000 in         63 milliseconds
     25000 in         93 milliseconds
     30000 in        125 milliseconds
     35000 in        204 milliseconds
     40000 in        203 milliseconds
     45000 in        218 milliseconds
     50000 in        266 milliseconds
     60000 in        328 milliseconds
     70000 in        360 milliseconds
     80000 in        406 milliseconds
     90000 in        500 milliseconds
    100000 in        515 milliseconds
       100 in          0 milliseconds
       200 in          0 milliseconds
       300 in          0 milliseconds
       400 in          0 milliseconds
       500 in         15 milliseconds
      1000 in          0 milliseconds
      2000 in         16 milliseconds
      3000 in         31 milliseconds
      4000 in         31 milliseconds
      5000 in         47 milliseconds
     10000 in         94 milliseconds
     15000 in        156 milliseconds
     20000 in        188 milliseconds
     25000 in        250 milliseconds
     30000 in        281 milliseconds
     35000 in        375 milliseconds
     40000 in        375 milliseconds
     45000 in        453 milliseconds
     50000 in        484 milliseconds
     60000 in        625 milliseconds
     70000 in        672 milliseconds
     80000 in        813 milliseconds
     90000 in        875 milliseconds
    100000 in        984 milliseconds