WaBis

walter.bislins.ch

CDynArray: Anwendung

Zunächst zeige ich ein Beispiel, wie ein Array mit redim preserve auf klassische Weise vergrössert wird:

Ineffiziente klassische redim-Methode

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:

Effizientere Methode mit CDynArray

<!--#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

<!--#include file="perf.inc" -->

Funktionsweise CDynArray

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.

Weitere Infos zur Seite
Erzeugt Sonntag, 27. Juli 2008
von wabis
Zum Seitenanfang
Geändert Samstag, 18. Juli 2015
von wabis