DataObjects ... Geschwindigkeitstest der Zuweisung ...

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

Moderator: Moderatoren

DataObjects ... Geschwindigkeitstest der Zuweisung ...

Beitragvon brandelh » Mo, 27. Apr 2015 12:51

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: 13332
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon brandelh » Mo, 27. Apr 2015 12:54

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13332
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon Wolfgang Ciriack » Mo, 27. Apr 2015 17:05

Ich denke, Dataobjects sind dynamisch ?
Dann sollte doch ein oObj:xyz123:="neues Feld" möglich sein ?
Viele Grüße
Wolfgang
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2227
Registriert: Sa, 24. Sep 2005 8:37
Wohnort: Berlin

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

Beitragvon brandelh » Di, 28. Apr 2015 1:13

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13332
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon AUGE_OHR » Di, 28. Apr 2015 4:07

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) 54-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10211
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitragvon brandelh » Di, 28. Apr 2015 5:41

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13332
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim


Zurück zu Unterschiede Version 1.9 <-> 2.0

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste