DataObjects ... Geschwindigkeitstest der Zuweisung ...

Hier können die Unterschiede, Fehler und Probleme zwischen den Versionen bzw. bei der Migration besprochen werden

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

DataObjects ... Geschwindigkeitstest der Zuweisung ...

Beitrag von brandelh »

Auf dem Forentreffen entstand die Diskussion, ob die Zuweisung mittels &() nicht langsam wäre ... ich habe es einfach ausprobiert:

Code: Alles auswählen

#include "Common.ch"
#include "Xbp.ch"

PROCEDURE Main
   local nTimeMacro, nTimeDirekt
   local oObj, i, nMax := 1000000
   local cFeld

   cFeld   := "Name"

   ? "Mit Macro Operator"
   oObj := DataObject():new()
   nTimeMacro := seconds()
   for i := 1 to nMax
       oObj:&(cFeld) := "Name "+ntrim(i)
   next
   nTimeMacro := seconds() - nTimeMacro
   ? "Dauer: ",   nTimeMacro ,"Sekunden"

   ? "Direkter Aufruf"
   oObj := DataObject():new()
   nTimeDirekt := seconds()
   for i := 1 to nMax
       oObj:Name := "Name "+ntrim(i)
   next
   nTimeDirekt := seconds() - nTimeDirekt
   ? "Dauer: ",   nTimeDirekt ,"Sekunden"
   ?
   ? "Unterschied: ", abs(nTimeMacro - nTimeDirekt),"Sekunden"
   ?
   ? "Anzahl der LOOPS: "+transform(nMax,"999,999,999")
   inkey(20)


RETURN

function ntrim(n)
return alltrim(str(n))
Ergebnis:

Code: Alles auswählen


Mit Macro Operator
Dauer:           1,50 Sekunden
Direkter Aufruf
Dauer:           1,45 Sekunden

Unterschied:           0,05 Sekunden

Anzahl der LOOPS:   1.000.000
wobei der Unterschied bei mehreren Versuchen zwischen 0,03 und 0,09 Sekunden bei 1.000.000 Durchläufen schwankte :!:

Ich denke nicht, dass das langsam ist ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DataObjects ... Geschwindigkeitstest der Zuweisung ...

Beitrag von brandelh »

sicherheitshalber sollte ich erwähnen, dass die dauerhafte Nutzung des GLEICHEN dataobjects natürlich je nach Umständen nicht möglich ist,
aber nur so konnte ich überhaupt einen direkten Vergleich anstellen. Schön wäre es, wenn es eine Methode gäbe:

oDO:AddField(cName,cInhalt) ... aber die gibt es eben nicht. ;-)
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: DataObjects ... Geschwindigkeitstest der Zuweisung ...

Beitrag von Wolfgang Ciriack »

Ich denke, Dataobjects sind dynamisch ?
Dann sollte doch ein oObj:xyz123:="neues Feld" möglich sein ?
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DataObjects ... Geschwindigkeitstest der Zuweisung ...

Beitrag von brandelh »

natürlich kannst du den Namen im Quellcode ausschreiben, im Beispiel ging es um das komplette Auslesen eines Datensatzes in einer Schleife und da kennt man die Namen erst zur Laufzeit.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: DataObjects ... Geschwindigkeitstest der Zuweisung ...

Beitrag von AUGE_OHR »

brandelh hat geschrieben:natürlich kannst du den Namen im Quellcode ausschreiben, im Beispiel ging es um das komplette Auslesen eines Datensatzes in einer Schleife und da kennt man die Namen erst zur Laufzeit.
JA ... aber eben nicht so wie "normal" gedacht.

Code: Alles auswählen

  SET DEFAULT TO u:\source\xpp\samples\shark\data\misc
  USE parts // <- das ist eine DBF !

  // Ermitteln der Menge als Array von DataObjekten
  SELECT partno, partname, sellprice FROM parts WHERE sellprice < 200 INTO OBJECTs aObjs
die DataObjects werden nicht (einzeln) "manuell" angelegt sondern durch den Zusatz "INTO OBJECTs"

somit ergibt sich dann folgende Schleife

Code: Alles auswählen

   aNames := aObjs[1]:ClassDescribe( CLASS_DESCR_MEMBERS )
   FOR i:=1 TO Len(aObjs[1])
      AddColumn( oBrowse, i, aNames[i][CLASS_MEMBER_NAME], 8 )
   NEXT
um damit ein Browse zu bauen.
Dateianhänge
DataObjects.zip
benötigt Xbase++ v2.x
(16.95 KiB) 437-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DataObjects ... Geschwindigkeitstest der Zuweisung ...

Beitrag von brandelh »

Hallo Jimmy,

das ist ein nettes Beispiel dafür, was man mit DataObjects machen kann, die man mit SELECT erhält.

Das Beispiel von OBEN und dem Vortrag von JAN bezog sich aber auf eine ganz andere Vorgehensweise,
die entweder vom Programm vorgegeben wurde (weil man sonst jede Menge ändern müsste) oder man
einfach weiterhin OHNE diese SELECT SQL Sachen auskommen will (oder muss).
So war es mir bis jetzt nicht möglich meine große DBF mit SELECT zu durchforsten und auch beim
Einschränken der Treffer mit Suchbegriffen in Variablen tut man sich schwer.

Was ich hier zeigen wollte war, dass der Einwand von TOM, dass dies veraltet oder langsam ist einfach nicht stimmt.
Es ist schnell und der einzige Weg zur Laufzeit eine iVar in einem bestehenden DataObject anzulegen,
deren Name im Quellcode nicht geschrieben werden konnte.

Ich gebe TOM dahingehend Recht, dass Alaska versäumt hat eine Methoden mehr anzubieten, wie z.B.

oDO:setVar(cVarName,uInhalt)
oDO:getVar(cVarName)
oDO:readRecord()
oDO:writeRecord()

das kann man aber in eigenen Ableitungen der Klasse nachrüsten, genauso wie z.B. recno() oder select Bereich ... ;-)
Gruß
Hubert
Antworten

Zurück zu „Unterschiede Version 1.9 <-> 2.0“