mschnell hat geschrieben:Was ist denn "GNZ_GlobZahlenbasis" ?
Die GNURZ-Routinen sind so flexibel, dass sie mit beliebiger Zahlenbasis (Zehnersystem=10, Hexadezimalsystem=16, u.s.w.) rechnen können. Die Leistung der CPU wird dann ideal ausgenutzt, wenn die Zahlenbasis so gewählt wird, dass der verwendete Datentyp (dword) in seiner vollen Breite genutzt wird. Das wird durch die Variable GNZ_GlobZahlenbasis festgelegt.
Setlength kann ganz schlecht für die Performance sein. Wenn mit Setlength ein dynamisches Array vergrößert wird, muss es u.U. komplett kopiert werden, weil es ja am Ursprungs-Ort nicht mehr zwischen die davor und dahinter angelegten Variablen passt.
Ok, das leuchtet ein. Habe die Routinen so programmiert, dass es möglichst sparsam benutzt wird. Eine Frage: Es kostet also vermutlich weniger Rechenzeit, ein Array zu verkleinern als es zu vergrößern? Wenn ja würde ich den Code nochmal schnell durchschauen und entsprechende Optimierungen durchnehmen, denn darauf hatte ich bei der Programmierung nicht geachtet.
Man könnte sich aber angucken, ob der Compiler Schleifen wie
[...]
gut optimiert
Die Zeilen
Code: Alles auswählen
for n:=0 to aAnz-1 do
begin
ZwSp:= ZwSp + a[n] + b[n];
des Additionsalgorithmus wandelt der FPC wie folgt in Assembler um:
Code: Alles auswählen
# [270] for n:=0 to aAnz-1 do
movl -72(%ebp),%eax
movl $0,%edx
subl $1,%eax
sbbl $0,%edx
movl %eax,%ecx
movl $0,%ebx
cmpl %ebx,%ecx
jb .Lj478
decl %ebx
.balign 4,0x90
.Lj479:
incl %ebx
.stabn 68,0,272,.Ll102 - GNURZ_TGNURZ_$__GNZADD$GNZTYP$GNZTYP$$GNZTYP
.Ll102:
# [272] ZwSp:= ZwSp + a[n] + b[n];
movl 12(%ebp),%eax
movl (%eax,%ebx,4),%esi
addl -68(%ebp),%esi
movl 8(%ebp),%eax
movl (%eax,%ebx,4),%eax
addl %eax,%esi
movl %esi,-68(%ebp)
.stabn 68,0,273,.Ll103 - GNURZ_TGNURZ_$__GNZADD$GNZTYP$GNZTYP$$GNZTYP
mit laufenden Pointern arbeitet, statt immer wieder die Adresse über den Index auszurechnen.
scheint er zu machen. Das würde demnach die lästige Arbeit mit Pointern ersparen
Danke für die Hinweise
Euklid