Zunächst zeige ich ein Beispiel, wie ein Array mit redim preserve auf klassische Weise vergrössert wird:
function LoadDataListFromDb() dim recordSet, dataList, lastIx dataList = Array() lastIx = 0 set recordSet = LoadRecordsetFromDB() while not recordSet.EOF redim preserve dataList(lastIx) dataList(lastIx) = recordSet("Data") lastIx = lastIx + 1 recordSet.MoveNext wend LoadDataListFromDB = dataList end function
Für einige Hundert bis Tausend Elemente ist diese Methode noch schnell genug, belastet jedoch den Server mehr als nötig. Mit der Klasse CDynArray aus perf.inc sieht dasselbe Programm wiefolgt aus:
<!--#include file="perf.inc" --> <% function LoadDataListFromDb() dim recordSet, dataList set dataList = NewDynArray(0) set recordSet = LoadRecordsetFromDB() while not recordSet.EOF dataList.AddItem recordSet("Data") recordSet.MoveNext wend LoadDataListFromDB = dataList.GetArray(false) end function %>
Beim Erzeugen eines CDynArray mit NewDynArray kann als Argument die erwartete Grösse des Arrays mitgegeben werden. Wenn diese Grösse nicht bekannt ist, übergibt man einfach 0. Der Array wird in jedem Fall immer dynamisch vergrössert, wenn mehr Daten hinzugefügt werden als geschätzt. Wenn jedoch die (maximale) Zielgrösse bekannt ist, soll man dies dem CDynArray bekannt geben, damit er nicht unnötig viele Vergrösserungs-Schritte mit Umkopieren der Daten durchführen muss.
<!--#include file="perf.inc" -->
Intern wir CDynArray dadurch schneller, dass der Array nicht bei jedem AddItem, AddObject vergrössert wird. Vielmehr wird der Array in grossen Schritten vergrössert und aufgefüllt und erst zum Schluss beim Aufruf von GetArray auf die korrekte Grösse zurückgesetzt. Dadurch wird sehr viel Umkopiererei und damit Rechenzeit eingespart.