Seite 1 von 1

DataObjects ... Geschwindigkeitstest der Zuweisung ...

Verfasst: Mo, 27. Apr 2015 13:51
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 ;-)

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

Verfasst: Mo, 27. Apr 2015 13:54
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. ;-)

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

Verfasst: Mo, 27. Apr 2015 18:05
von Wolfgang Ciriack
Ich denke, Dataobjects sind dynamisch ?
Dann sollte doch ein oObj:xyz123:="neues Feld" möglich sein ?

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

Verfasst: Di, 28. Apr 2015 2:13
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.

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

Verfasst: Di, 28. Apr 2015 5:07
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.

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

Verfasst: Di, 28. Apr 2015 6:41
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 ... ;-)