summaryrefslogtreecommitdiffstats
path: root/doc/html/TechNotes/FreeLists.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/html/TechNotes/FreeLists.html')
-rw-r--r--doc/html/TechNotes/FreeLists.html205
1 files changed, 205 insertions, 0 deletions
diff --git a/doc/html/TechNotes/FreeLists.html b/doc/html/TechNotes/FreeLists.html
new file mode 100644
index 0000000..1a4b8e8
--- /dev/null
+++ b/doc/html/TechNotes/FreeLists.html
@@ -0,0 +1,205 @@
+<html>
+<head>
+<title>Memory Management and Free Lists</title>
+</head>
+
+<body>
+
+<h1>Memory Management and Free Lists</h1>
+
+<pre>
+
+At Release 1.2.2, free list management code was introduced to the HDF5
+library. This included one user-level function, H5garbage_collect, which
+garbage collects on all the free-lists. H5garbage_collect is the only user-
+accessible (i.e., application developer-accessible) element of this
+functionality.
+
+The free-lists generally reduce the amount of dynamic memory used to around
+75% of the pre-optimized amount as well as speed up the time in the library
+code by ~5% The free-lists also help linearize the amount of memory used with
+increasing numbers of datasets or re-writes on the data, so the amount of
+memory used for the 1500/45 free-list case is only 66% of the memory used for
+the unoptimized case.
+
+Overall, the introduction of free list management is a win: the library is
+slightly faster and uses much less system resources than before. Most of the
+emphasis has been focused on the main "thouroughfares" through the code;
+less attention was paid to the "back streets" which are used much less
+frequently and offer less potential for abuse.
+
+Adding a free-list for a data structure in the HDF5 library code is easy:
+
+Old code:
+---------
+ int foo(void)
+ {
+ H5W_t *w;
+
+ for(i=0; i&lt;x; i++) {
+ w=H5MM_malloc(sizeof(H5W_t));
+ &lt;use w&gt;
+ H5MM_xfree(w);
+ }
+ }
+
+New code:
+---------
+H5FL_DEFINE(H5W_t);
+
+ int foo(void)
+ {
+ H5W_t *w;
+
+ for(i=0; i&lt;x; i++) {
+ w=H5FL_ALLOC(H5W_t,0);
+ &lt;use w&gt;
+ H5FL_FREE(H5W_t,w);
+ }
+ }
+
+
+There are three kinds of free-lists:
+ -- for "regular" objects,
+ -- arrays of fixed size object (both fixed length and unknown length), and
+ -- "blocks" of bytes.
+
+ "Regular" free-lists use the H5FL_&lt;*&gt; macros in H5FLprivate.h and are
+ designed for single, fixed-size data structures like typedef'ed structs,
+ etc.
+
+ Arrays of objects use the H5FL_ARR_&lt;*&gt; macros and are designed for arrays
+ (both fixed in length and varying lengths) of fixed length data structures
+ (like typedef'ed types).
+
+ "Block" free-lists use the H5FL_BLK_&lt;*&gt; macros and are designed to hold
+ varying sized buffers of bytes, with no structure.
+
+ H5S.c contains examples for "regular" and fixed-sized arrays;
+ H5B.c contains examples for variable-sized arrays and "blocks".
+
+A free-list doesn't have to be used for every data structure allocated and
+freed, just for those which are prone to abuse when multiple operations are
+being performed. It is important to use the macros for declaring and
+manipulating the free-lists however; they allow the free'd objects on the
+lists to be garbage collected by the library at the library's termination
+or at the user's request.
+
+One public API function has been added: H5garbage_collect, which garbage
+collects on all the free-lists of all the different types. It's not required
+to be called and is only necessary in situations when the application
+performs actions which cause the library to allocate many objects and then
+the application eventually releases those objects and wants to reduce the
+memory used by the library from the peak usage required. The library
+automatically garbage collects all the free lists when the application ends.
+
+Questions should be sent to the HDF Help Desk at hdfhelp@ncsa.uiuc.edu.
+
+
+===========================================
+BENCHMARK INFORMATION
+===========================================
+
+New version with free lists:
+
+Datasets=500, Data Rewrites=15:
+ Peak Heap Usage: 18210820 bytes
+ Time in library code: 2.260 seconds
+ # of malloc calls: 22864
+
+Datasets=1000, Data Rewrites=15:
+ Peak Heap Usage: 31932420 bytes
+ Time in library code: 5.090 seconds
+ # of malloc calls: 43045
+
+Datasets=1500, Data Rewrites=15:
+ Peak Heap Usage: 41566212 bytes
+ Time in library code: 8.623 seconds
+ # of malloc calls: 60623
+
+Datasets=500, Data Rewrites=30:
+ Peak Heap Usage: 19456004 bytes
+ Time in library code: 4.274 seconds
+ # of malloc calls: 23353
+
+Datasets=1000, Data Rewrites=30:
+ Peak Heap Usage: 33988612 bytes
+ Time in library code: 9.955 seconds
+ # of malloc calls: 43855
+
+Datasets=1500, Data Rewrites=30:
+ Peak Heap Usage: 43950084 bytes
+ Time in library code: 17.413 seconds
+ # of malloc calls: 61554
+
+Datasets=500, Data Rewrites=45:
+ Peak Heap Usage: 20717572 bytes
+ Time in library code: 6.326 seconds
+ # of malloc calls: 23848
+
+Datasets=1000, Data Rewrites=45:
+ Peak Heap Usage: 35807236 bytes
+ Time in library code: 15.146 seconds
+ # of malloc calls: 44572
+
+Datasets=1500, Data Rewrites=45:
+ Peak Heap Usage: 46022660 bytes
+ Time in library code: 27.140 seconds
+ # of malloc calls: 62370
+
+
+Older version with no free lists:
+
+Datasets=500, Data Rewrites=15:
+ Peak Heap Usage: 25370628 bytes
+ Time in library code: 2.329 seconds
+ # of malloc calls: 194991
+
+Datasets=1000, Data Rewrites=15:
+ Peak Heap Usage: 39550980 bytes
+ Time in library code: 5.251 seconds
+ # of malloc calls: 417971
+
+Datasets=1500, Data Rewrites=15:
+ Peak Heap Usage: 68870148 bytes
+ Time in library code: 8.913 seconds
+ # of malloc calls: 676564
+
+Datasets=500, Data Rewrites=30:
+ Peak Heap Usage: 31670276 bytes
+ Time in library code: 4.435 seconds
+ # of malloc calls: 370320
+
+Datasets=1000, Data Rewrites=30:
+ Peak Heap Usage: 44646404 bytes
+ Time in library code: 10.325 seconds
+ # of malloc calls: 797125
+
+Datasets=1500, Data Rewrites=30:
+ Peak Heap Usage: 68870148 bytes
+ Time in library code: 18.057 seconds
+ # of malloc calls: 1295336
+
+Datasets=500, Data Rewrites=45:
+ Peak Heap Usage: 33906692 bytes
+ Time in library code: 6.577 seconds
+ # of malloc calls: 545656
+
+Datasets=1000, Data Rewrites=45:
+ Peak Heap Usage: 56778756 bytes
+ Time in library code: 15.720 seconds
+ # of malloc calls: 1176285
+
+Datasets=1500, Data Rewrites=45:
+ Peak Heap Usage: 68870148 bytes
+ Time in library code: 28.138 seconds
+ # of malloc calls: 1914097
+
+
+===========================================
+Last Modified: 3 May 2000
+HDF Help Desk: hdfhelp@ncsa.uiuc.edu
+
+</pre>
+</body>
+</html>