Hi,
ich habe mal die Zugriffszeiten einer Remote Java-Anwendung gegen meinen häuslichen Notes-Server gemessen.
Lotus-Script sollte sich ähnlich verhalten.
Die ersten beiden sind selbsterklärend.
Daten V_MP ist das holen einer View, daraus eine Collection, dann ein iterieren über z. Zt. 6 Dokumente und das Schreiben von so ermittelten Daten an jeweis die Stelle [n][0] eines Multi-Dimensionalen Arrays sowie erzeugen einer java.util.HashMap und dessen Befüllen (pro Dokument ein Entry).
Rest ist nochmal sowas in der Art von Daten_VMP aber mit nur 0-2 Dokumenten + wesentlich mehr Operationen mit get() auf java.util.HashMap, weiteres Befüllen des Multi-Dimensionalen Arrays. Teilweise gibt es in den NotesCollection mit dem jeweiligen key keine Daten (Erklärung von 0 Sekunden).
Die einzelnen Aufrufe finden immer wieder neu statt.*
Aufruf 1:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,187 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,234 Sekunden
Daten V_MP dauerte 0,079 Sekunden
Rest dauerte 0,015 Sekunden
Aufruf 2:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,016 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,094 Sekunden
Daten V_MP dauerte 0,015 Sekunden
Rest dauerte 0,016 Sekunden
Aufruf 3:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,016 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,093 Sekunden
Daten V_MP dauerte 0,016 Sekunden
Rest dauerte 0,016 Sekunden
Aufruf 4:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,015 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,125 Sekunden
Daten V_MP dauerte 0,016 Sekunden
Rest dauerte 0,047 Sekunden
Aufruf5:
NotesFactory.createSessionWithFullAccess("kennwort") dauerte 0,015 Sekunden
nSession.getDatabase (serverName, serverPath) dauerte 0,094 Sekunden
Daten V_MP dauerte 0,031 Sekunden
Rest dauerte 0 Sekunden
Was mir nun so bewußt geworden:
- Die bei weitem kostspieligste Operation ist stets das Holen des NotesDatabase-Objekts.
- Die Session wird offenbar irgendwo in Notes gecacht (erster Aufruf dauert länger und in meinem Code wird es (noch) nicht gecached.
- Iterieren über die View ist nicht so kostspielig (Optimierungsmöglichkeiten mglchws über NotesViewEntry (oder so ähnlich).
In Java kann ich sowas ganz einfach basteln rund um die Funktion System.currentTimeMillis() oder so ähnlich.
Werd die Klasse noch verbessern, mit Log4U integrieren und ins "Java für Anfänger" posten.
FRAGE1: Ich habe jetzt keine Zeit in der Doku nachzuschlagen. Kann man sowas auch mit LotusScript machen? Wenn ja, warum habe ich das nie gemacht?
FRAGE2: Warum ist das Holen der NotesDatabase so kostspielig?
Ist es der SicherheitsCheck innerhalb von Notes?
Ist das Objekt so groß?
Es ist jeweils der erste Zugriff auf den Server. Ist das vielleicht kostspielig?
FRAGE3: Der NotesServer ist natürlich sehr nah an dem Client (beides auf 1 Rechner). Gibt es irgendwelche Tools, womit ich den LoopBackAdapter von Windows ausbremsen kann, um es Kunden-realistischer zu machen?
--------------------
* hat was damit zu tun, dass ich vor der großen Multithreading-Programmierungs-Offensive meine NotesConnection-Klasse mehrfach gebrauchte Objekte wie Notes-Datenbanken oder Sessions nicht in Status-Variablen ablegen kann)
Aber warum willst du überhaupt eine künstliche Verzögerung einbauen? Es sieht dann zwar realistischer aus, aber deine gemessenen Zeiten werden doch kein bisschen genauer. Eher im Gegenteil, der relative Anteil der untersuchten Operationen an der Geamtzeit sinkt ja.
Nicht ganz sicher, ob ich mich hier richtig ausgedrückt habe. ;D
Meine Messung misst nicht feingranular jeden einzelnen Aufruf, sondern ich starte die Messung irgendwo mit:
de.aja.system.SimplePerfChecker.start();
und beende die Messung irgendwo mit:
de.aja.system.SimplePerfChecker.stop();
Wenn dazwischen der zeitaufwendige remote-call auf die Server-Datenbank stattfindet, dann wäre es doch für die Messung realistisch, wenn dieser Zugriff langsamer stattfinden würde. Oder?
@Glombi: Das mit dem Effekt im Debugger war mir bekannt. Einige Aspekte dieser Konstruktion haben mich aber nun sehr erstaunt.
Laß dich von dem Java nicht verwirren. Ich arbeite ja mit dem Notes.jar Paket und das greift letztlich auf die gleichen C-Klassen für die Remote Procedure Calls von LoNo zu, wie Lotus Script auch (und die C-API sicherlich genauso).
Ich kann das NotesDatabase-Objekt in eine Objekt-Variable schreiben, den Server, auf dem die Datenbank liegt herunterfahren, arbeite aber trotzdem mit dem vorher gecachten NotesDatabase-Objekt weiter.
- Wenn ich dann nDatabase.isOpen() abfrage, gibt sie mir true zurück (ein Skandal, zumal es keinen nDatabase.close() gibt!)
- Ich kann mir die Views holen nDatabase.getView("aView"); // o.k. das hat mich nicht überrascht
- Ich kann mir dann aber von einer solchen neu erzeugten View eine (notes)-DocumentCollection holen mit nCol = aView.getAllDocumentsByKey(key);
Ich habe bei diesem letzten Aufruf spätestens eine Exception erwartet. Er gab aber einfach eine leere NotesDocumentCollection zurück.
Aber auch die erste Möglichkeit bietet meiner Meinung nach keine Vorteile. Du misst und vergleichst die Zeit für verschiedene zusammengesetzte Operationen. Wenn nun zu jeder Zeit einfach eine Verzögerung addiert wird, die lang im Vergleich zur Ausführungszeit des Codes ist, dann wird dadurch doch der relative Zeitunterschied zwischen den Operationen (z.B. als prozentuale Angabe) geringer, bei einer feststehenden Genauigkeit der Zeitmessung also eher ungenauer.
Ich vergleiche hier nicht 2 unterschiedliche Zugriffsstrategien.
Du meinst sowas in der Art wie:
Const NETWORK_LATENCY = 5;
(t0 + t1 * NETWORK_LATENCY + t2) / (t3 + t1 * NETWORK_LATENCY + t5)
gibt weniger deutliche Ergebnisse als:
(t0 + t1 + t2) / (t3 + t1 + t5)
<zwischenfrage>
Heisst sowas netzwerk latenz, oder war das jetzt meine eigene Sprachschöpfung?
</zwischenfrage>
Mir ist jetzt aber klargeworden, was ich eigentlich will:
Die objektive und subjektive* Geschwindigkeit der GUI unter realistischen Bedingungen testen, wobei das natürlich von einer Menge von Faktoren abhängt, so daß man es schlußendlich eh nur beim Kunden testen kann.
Ich kann den Thread auch für eine festgesetzte Zahl an Milisekunden schlafen legen, der befolgt das dann aber auch nur ungenau, was dann wiederum realistische wiederspiegeln würde.
* mein User-Empfinden