Das Notes Forum

Sonstiges => Offtopic => Thema gestartet von: m3 am 24.10.06 - 09:27:02

Titel: Inkompetente Vollkoffer
Beitrag von: m3 am 24.10.06 - 09:27:02
Ich durfte letzte Woche den Agent Code debuggen, der aus einer Kooperation eines namhaften Archiv-SW Herstellers und eines IT-Dienstleisters mit drei Buchstaben entsprungen ist. Dabei bin ich auf folgenden Code gestoßen (nur die relevanten Teile, anonymisiert):
Code
...
Dim viewXXXX As NotesView
...
Set viewXXXX = archiveDb.GetView(xxview)
...
hits = getHits(viewXXXX)

Ok, klingt ja noch nicht so schlimm. Aber irgendwie klingelten bei mir bei der Funktion "getHits" die Alarmglocken. Also hab ich mal nachgeschaut, was die Funktion denn so macht (wieder gekürzt und anonymisiert):
Code
Function getHits(view As NotesView) As Integer
	getHits = 0
	Dim docAct As NotesDocument
	
	Set docAct = view.GetFirstDocument()
	Do While Not (docAct Is Nothing)
		getHits = getHits + 1
		Set docAct = view.GetNextDocument(docAct)
	Loop
...
End Function

Und die Kollegen wundern sich, warum der Code so unperformant ist.  :'(

Und für jene, die nicht verstehen warum ich mich so echauffiere:
Das NotesView-Objekt hat eine Eigenschaft "EntryCount", welche die Anzahl der Dokumente in der View zurückliefert, da brauch ich nicht über alle Dokumente iterieren und mitzählen.  >:(

Und für den Code haben sie auch noch mächtig Kohle verlangt.  >:(
Titel: Re: Inkompetente Vollkoffer
Beitrag von: eknori am 24.10.06 - 09:30:46
EntryCount  --> This property is new with Release 6.

Haben die wahrscheinlich aus kompatibilitätsgründen noch nicht umgebaut  ;D *prust*
Titel: Re: Inkompetente Vollkoffer
Beitrag von: m3 am 24.10.06 - 09:34:04
LOL. Das wäre natürlich eine Erklärung, aber dann geh ich doch über das AllEntries Proprty und hol mir den Count aus der NotesViewEntryCollection, oder?
Titel: Re: Inkompetente Vollkoffer
Beitrag von: eknori am 24.10.06 - 09:37:02
Dann läuft das aber nicht mehr unter 4.x
Titel: Re: Inkompetente Vollkoffer
Beitrag von: m3 am 24.10.06 - 09:41:26
Die App wurde unter 5 aufgesetzt. Mir tut sowas einfach weh.
Titel: Re: Inkompetente Vollkoffer
Beitrag von: Glombi am 24.10.06 - 09:55:20
Wenn die Ansicht kategorisiert ist, dann liefert "getHits" einen falschen Wert, denn es werden dann Dokumente mehrfach gezählt, falls das zu kategorisierende Feld Mehrfachwerte enthält. Vielleicht gibts dann unerwartete Nebeneffekte.

   Set view = db.GetView("Alles")
   Set vc = view.AllEntries
   
   Msgbox vc.count

liefert übrigens das korrekte Ergebnis für eine kategorisierte View.

Andreas
Titel: Re: Inkompetente Vollkoffer
Beitrag von: m3 am 24.10.06 - 09:56:45
Nope, ist nicht kategorisiert. Die View existiert nur, dass sie durch diesen Agent abgearbeitet wird.  :(
Titel: Re: Inkompetente Vollkoffer
Beitrag von: heini_schwammerl am 24.10.06 - 22:51:04
Mehr als 32767 Dokumente sind in der Ansicht wohl nicht drin, so schlimm kann das nicht sein mit der Performance.
Titel: Re: Inkompetente Vollkoffer
Beitrag von: Semeaphoros am 25.10.06 - 00:26:50
Naja, Heini, aus dem hohlen Bauch sowas zu sagen ist heikel, da müsste man tatsächlich mit einem Profiler genauer hinsehen. Dazu kommt, wer sowas implementiert, hat meistens noch mehr Stellen mit fraglicher Performance drin.
Titel: Re: Inkompetente Vollkoffer
Beitrag von: flaite am 25.10.06 - 04:36:08
Zumindest hat er das in einer kurzen Funktion weggekappselt weshalt es auch so gut auffällt.
Für mich zeigt das, dass der Autor der Funktion irgendwie schon wußte was er tat. Vielleicht nicht in Notes.
Jeder selbstrespektierende Noob, der einen das Leben wirklich schwermacht, tut es selbstverständlich so:

Code
Sub Main
//Ein paar crasse Schleiven 

Set docAct = view.GetFirstDocument()
	Do While Not (docAct Is Nothing)
// Ein bischen sinnlose Zeugs, 
//das nix 
//mit der eigentlichen Sache in dieser Schleife zu tun hat. 

		getHits = getHits + 1
// Ein bischen sinnlose Zeugs, 
//das nix 
//mit der eigentlichen Sache in dieser Schleife zu tun hat. 

		Set docAct = view.GetNextDocument(docAct)
	Loop

Aber dafür eine Menge Geld bezahlen, dass einem als Kunde solch gravierende Dummheiten wenigstens direkt ins Auge springen, find ich auch ein bischen übertrieben.

Übrigens werden auch Profiler-Reports durch einen lange-Schleifen-lange-Funktionen Programmierstil deutlich schwerer zu lesen.
Titel: Re: Inkompetente Vollkoffer
Beitrag von: m3 am 25.10.06 - 09:21:53
@heini: Ich hab da mal was "gebenchmarked":

Um 4.362 Dokumente zu zählen, braucht man auf einem meiner Server (Agent lokal auf dem PC gestartet):
mit Schleife durchlaufen: 93,1992 Sek.
mit AllEntries.Count: 0,7227 Sek.
mit view.EntryCount: 0,0195 Sek.

Um 4.362 Dokumente zu zählen, braucht man direkt auf dem Server :
mit Schleife durchlaufen: 0,668 Sek.
mit AllEntries.Count: 0,3008 Sek.
mit view.EntryCount: 0 Sek.


Um 4.362 Dokumente zu zählen, braucht man auf einem PC:
mit Schleife durchlaufen: 0,5117 Sek.
mit AllEntries.Count: 0,1875 Sek.
mit view.EntryCount: 0 Sek.

Als es gibt schon Unterschiede. ;)


@Jens: Ja, deswegen schau ich auf den anderen Code gar nicht hin ;)

@Axel: Ja, ein absoluter Noob war es nicht, aber für die bezahlte Summe ist der Code ned wirklich OK. Aber daran kann ich jetzt auch nix mehr ändern.
Titel: Re: Inkompetente Vollkoffer
Beitrag von: heini_schwammerl am 26.10.06 - 15:12:39
Hallo m3,

Ich wollte eigentlich keinen Benchmark provozieren sondern nur dezent auf den Umstand hinweisen, daß man bei einem Counter mit einer Integerzahl vorsichtig sein muß.
Sonst hat man sich schnell verzählt, nämlich wenn die Ansicht mehr als 32767 Dokumente hat.
Abgesehen davon sollte man das in der Tat in dieser Form wohl nicht machen.
Titel: Re: Inkompetente Vollkoffer
Beitrag von: koehlerbv am 26.10.06 - 16:14:22
Die Zählung in einer Integer-Variablen ist aber nur konsequent, Heini  ;D Zumindest, wenn ich mir das Verfahren so anschaue mit seinen Konsequenzen.
@Martin, ich nehme jetzt mal an, dass man - wenn schon, denn schon - auch auf ein ordentliches ErrorHandling in der Function verzichtet hat, so dass getHits auch mal Null sein konnte (wenn ein overflow eintritt)?

Bernhard