Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

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

DataObjects ... Geschwindigkeitstest der Zuweisung ...

Beitrag von brandelh » Mo, 27. Apr 2015 13: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: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Mo, 27. Apr 2015 13: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
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2282
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

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

Beitrag von Wolfgang Ciriack » Mo, 27. Apr 2015 18:05

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

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

Beitrag von brandelh » Di, 28. Apr 2015 2: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
AUGE_OHR
Marvin
Marvin
Beiträge: 10522
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

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

Beitrag von AUGE_OHR » Di, 28. Apr 2015 5: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) 67-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Di, 28. Apr 2015 6: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

Antworten