 |
| Wie kann ich die performance
meiner Programme weiter steigern? |  |
 |
 |
Jedes Programm ist nur so gut wie der, der es bedient. Diese pauschall
Aussage gilt sicherlich auch für tdbengine. Also gilt für "gut" auch ".
Es gibt Kniffe mit deren Hilfe Sie auch das letzte Quäntchenpinch
Geschwindigkeit Ihren Programmen abverlangen können
Beachten Sie aber, dass es oftmals Sinn macht einen Kompromiss zwischen Geschwindigkeit und Stabilität zu finden. Was nützt die schnellste Datenbank wenn die Einträge regelmäßig verschwinden?
Mit einer gechickten Kombination von der hier aufgelisteten Kniffe können Sie deutlich mehr aus Ihren Anwendungen rausholen.
1.
Laufzeitschalter "No Break"setzen.
Die tdbengine
überprüft default-mässig mehrmals pro Sekunde, ob sich im
gleichen Verzeichnis, in dem das gerade ausgeführte .prg liegt, auch
eine Datei namens "abort" befindet. Findet sie eine solche Datei, so
bricht sie augenblicklich die Ausführung des Moduls ab und versucht die
Abort-Datei zu löschen.
Das ist sehr praktisch, wenn Sie als Entwickler/Systemadministrator nur
begrenzten Zugang zum Server haben, auf dem die tdbengine läuft. Somit
können Sie ganz einfach per FTP eine endloslaufende tdbengine
"abschiessen". Sie brauchen nur eine leere Textdatei mit dem Namen
"abort" ins Verzeichnis des Moduls spielen und alsbald beendet sich der
laufende Prozess.
Wenn Sie jedoch sowieso Shell- oder gar Root-Zugang zum ausführenden
Server haben, dann ist diese Art der Programmterminierung von aussen
gar nicht von Nöten.
Setzen Sie daher einfach den Laufzeitschalter nb auf 1, sobald Ihre Main-Procedure startet.
PROCEDURE Main SetPara("nb 1") ... //hier gehts los
ENDPROC
Je nach Programm kann das einen Performance-Gewinn von bis zu 50
Prozent einbringen. (Bei einer Schleife, die nichts anderes machte, als die
Zählvariable zu inkrementieren waren es in meinen Tests ganze 60% mehr
Performance)
Hier der Quellcode mit dem ich getestet und gemessen habe:
PROCEDURE Main SetPara("nb 1") CGICloseBuffer VAR x,y : INTEGER = 0 VAR n : REAL = Now WHILE x++ < 100 DO y := 0 WHILE y++ < 300000 DO END END CGIWriteLn("t = "+TimeStr(Now - n,3))
ENDPROC
Hinweis: Wenn Sie sich definitiv sicher sind, dass Sie völlig auf
die abort-Dateien verzichten können, dann dürfen Sie die Abfrage danach
auch direkt in Ihrer tdbengine.ini abschalten. Setzen Sie dazu einfach
unter [globals] oder [ihrprg] nobreak=0 Das erspart es Ihnen, jedesmal
händisch Sorge tragen zu müssen, dass der Schalter umgelegt wird.
2. Schleifen optimieren - in der Kürze liegt die Würze
Schreiben Sie zum Inkrementieren von Laufvariablen X++ bzw. X-- anstatt
X := X +1 bzw. X := X -1 - das bringt enorme Performance.
Packen Sie ausserdem soviel wie möglich in eine Anweisung.
Diese Schleife soll z.B. die Anzahl der Einträge bis zum ersten
leeren (hier =0) Element des Arrays aLfd ermitteln. Dazu wird jedes
Element mit 0 verglichen. Liefert der Vergleich WAHR zurück, dann wird
die Schleife beendet. Die Laufvariable X enthält die Anzahl der
belegten Elemente.
x:=0
REPEAT
UNTIL ~aLfd[x++]
ist spürbar schneller als
x:=0
REPEAT x := x +1
UNTIL aLfd[x] = 0
Die Tilde ~ ist eine Kurzschreibform von NOT, negiert also das Ergebnis des darauffolgenden Ausdrucks.
|