ListBox() statt Array ?
Moderator: Moderatoren
- AUGE_OHR
- Marvin
- Beiträge: 12910
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
ListBox() statt Array ?
hi,
ich arbeite gerne mit Array auch weil die schön schnell sind.
nun ist die "übliche" Method AADD() und das ist schnell ... wirklich ?
für eine XbpListBox() oder XbpComboBox() würde man ja AddItem() nehmen und das ist ja deutlich langsamer.
was wäre nun wenn ich eine Listbox "schneller" füllen könnte mit 1.000.000 Elementen als per AADD() ein Array ?
ich arbeite gerne mit Array auch weil die schön schnell sind.
nun ist die "übliche" Method AADD() und das ist schnell ... wirklich ?
für eine XbpListBox() oder XbpComboBox() würde man ja AddItem() nehmen und das ist ja deutlich langsamer.
was wäre nun wenn ich eine Listbox "schneller" füllen könnte mit 1.000.000 Elementen als per AADD() ein Array ?
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9373
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: ListBox() statt Array ?
Hallo, Jimmy.
Willst Du darauf hinaus, dass man in diesem Fall ein (unsichtbares) Listbox-Objekt als schnelleres Array-Replacement benutzen könnte? Was ist mit der Suche im Array und mit dem Löschen/Einfügen/Ersetzen von Elementen?
Willst Du darauf hinaus, dass man in diesem Fall ein (unsichtbares) Listbox-Objekt als schnelleres Array-Replacement benutzen könnte? Was ist mit der Suche im Array und mit dem Löschen/Einfügen/Ersetzen von Elementen?
Herzlich,
Tom
Tom
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2829
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 97 Mal
- Danksagung erhalten: 13 Mal
Re: ListBox() statt Array ?
Hallo,
oder es könnte die Frage sein, ob (und wie) man an das Array herankommt, in dem die ListBox() Einträge abgelegt sind.
Gruss,
Georg
oder es könnte die Frage sein, ob (und wie) man an das Array herankommt, in dem die ListBox() Einträge abgelegt sind.
Gruss,
Georg
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- AUGE_OHR
- Marvin
- Beiträge: 12910
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: ListBox() statt Array ?
ich vergass zu sagen das ich von eine "native" Listbox() spreche.
ich bin noch beim ausprobieren mit der "native" ListBox wo ich eine Demo mit "Zeigern" ( Pointer ) statt String als Elemente ausgestattet habe.
damit hab ich erstaunliche Ergebniss erreicht wenn ich "grosse" Datenmengen verarbeiten will.
primär denke ich da an "Import" Dateien die ich im Speicher "weiterverarbeiten" möchte was dann bis 2 GB möglich wäre.
btw. Pablo sagt das 3GB zwar möglich wären, aber nicht mit ALINK gehen würde !
die Demo ist noch nicht gut genug um die raus-zugeben, also hab noch etwas Geduld.
du bist gut !Tom hat geschrieben:Willst Du darauf hinaus, dass man in diesem Fall ein (unsichtbares) Listbox-Objekt als schnelleres Array-Replacement benutzen könnte?
hm ... ja ... die API Befehle wären da ... man müsste dafür dann einen Wrapper schreiben.Tom hat geschrieben:Was ist mit der Suche im Array und mit dem Löschen/Einfügen/Ersetzen von Elementen?
ich bin noch beim ausprobieren mit der "native" ListBox wo ich eine Demo mit "Zeigern" ( Pointer ) statt String als Elemente ausgestattet habe.
damit hab ich erstaunliche Ergebniss erreicht wenn ich "grosse" Datenmengen verarbeiten will.
primär denke ich da an "Import" Dateien die ich im Speicher "weiterverarbeiten" möchte was dann bis 2 GB möglich wäre.
btw. Pablo sagt das 3GB zwar möglich wären, aber nicht mit ALINK gehen würde !
die Demo ist noch nicht gut genug um die raus-zugeben, also hab noch etwas Geduld.
gruss by OHR
Jimmy
Jimmy
- Herbert
- Der Entwickler von "Deep Thought"
- Beiträge: 1991
- Registriert: Do, 14. Aug 2008 0:22
- Wohnort: Gmunden am Traunsee, Österreich
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: ListBox() statt Array ?
Sind solche Methoden sinnvoll? Letztendlich wird der GUI-Speicher arg belastet.
Was ist, wenn ich 3,4, solcher Listboxen erstellen würde?
Was ist, wenn ich 3,4, solcher Listboxen erstellen würde?
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...
- AUGE_OHR
- Marvin
- Beiträge: 12910
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: ListBox() statt Array ?
hi,
scheint so als wenn ich das Demo von Pablo doch noch nicht verstanden habe.
bei weiteren Test komme ich nicht auf gewünschte Resultate was die Geschwindigkeit angeht ...
Es wird für jede Aktion "einzeln" Speicher angefordert ... und irgendwann freigegeben.
um so was muss ich nun der Xbase++ User zum Glück nicht kümmern das macht dann der CG.
trotzdem entstehen dadurch "Löcher" ... der Speicher ist sozusagen "defragmentiert".
das Gegenteil wäre nun den gesamten Speicher anzufordern und "ein einem Stück" in den Speicher zu "schreiben" ( Peek ).
Beispiel AADD vs ARRAYwelche Version ist "schneller" ?
vermutlich wird man bei "nur" 512 kaum was feststellen ( SET DECIMALS TO 6 ) aber leider "knallt" es wenn man z.b. ARRAY[4096] versucht.
bei Listbox() / Combobox() wird nun "empfohlen" bei grossen Datenmengen den Speicher vorher anzufordernwas sich deutlich (200-300%) bemerkbar macht.
nun habe ich beim Ownerdraw von String auf "Zeiger" ( Pointer ) umgestellt.
aus der DrawItemStruct() erhalte ich vom MEMBER "itemData" einen "Zeiger" ( Pointer ) wo ich mein Element im Speicher "finde"ich fragte mich bzw. Pablo ob ich auch das "Gegenteil" davon machen könnte, also "direkt" in den Speicher schreiben...
die Antwort von Pablo war dann
aber was würde es mir nützen "schnell" 2GB in den Speicher zu legen aber darin nicht "navigieren" zu können.
deshalb die Idee der "unsichtbaren" Listbox wo ich mittels der API Functionen im Grunde alles zum "navigieren" habe um damit direkt auf Speicher Adressen zuzugreifen. Um nun nicht mit API Funtionen zu hantieren kommt das ganze in einen "Wrapper" damit man mit den "gewohnten" Methoden wie GetData() / SetData() / GetItem() etc. arbeiten kann.
irgendwie geht es wohl auch ( bei Pablo in C )
scheint so als wenn ich das Demo von Pablo doch noch nicht verstanden habe.
bei weiteren Test komme ich nicht auf gewünschte Resultate was die Geschwindigkeit angeht ...
genau darum geht es das Xbase++ den Speicher "belastet".Herbert hat geschrieben:Letztendlich wird der GUI-Speicher arg belastet
Es wird für jede Aktion "einzeln" Speicher angefordert ... und irgendwann freigegeben.
um so was muss ich nun der Xbase++ User zum Glück nicht kümmern das macht dann der CG.
trotzdem entstehen dadurch "Löcher" ... der Speicher ist sozusagen "defragmentiert".
das Gegenteil wäre nun den gesamten Speicher anzufordern und "ein einem Stück" in den Speicher zu "schreiben" ( Peek ).
Beispiel AADD vs ARRAY
Code: Alles auswählen
a.)
FOR i := 1 TO 512
AADD(aArray,STR(i))
NEXT
b.)
aArray := ARRAY[512}
FOR i := 1 TO 512
aArray[i] := STR(i)
NEXT
vermutlich wird man bei "nur" 512 kaum was feststellen ( SET DECIMALS TO 6 ) aber leider "knallt" es wenn man z.b. ARRAY[4096] versucht.
bei Listbox() / Combobox() wird nun "empfohlen" bei grossen Datenmengen den Speicher vorher anzufordern
Code: Alles auswählen
@User32:SendMessageA(::hLbox,LB_INITSTORAGE,nNum,nBytes )
nun habe ich beim Ownerdraw von String auf "Zeiger" ( Pointer ) umgestellt.
aus der DrawItemStruct() erhalte ich vom MEMBER "itemData" einen "Zeiger" ( Pointer ) wo ich mein Element im Speicher "finde"
Code: Alles auswählen
cItemText := PeekStr(::oDrawItemStruct:itemData,0,-1)
die Antwort von Pablo war dann
bis 2GBThis will allow you to allocate big amount of itemsCode: Alles auswählen
cStr := "Hello" p := @kernel32:HeapAlloc(hHeap,8,Len(cStr)+1) PokeStr( p,0,cStr)
aber was würde es mir nützen "schnell" 2GB in den Speicher zu legen aber darin nicht "navigieren" zu können.
deshalb die Idee der "unsichtbaren" Listbox wo ich mittels der API Functionen im Grunde alles zum "navigieren" habe um damit direkt auf Speicher Adressen zuzugreifen. Um nun nicht mit API Funtionen zu hantieren kommt das ganze in einen "Wrapper" damit man mit den "gewohnten" Methoden wie GetData() / SetData() / GetItem() etc. arbeiten kann.
irgendwie geht es wohl auch ( bei Pablo in C )
aber wie es Pablo nun macht hab ich wohl doch noch nicht ganz verstanden ...This allow to read the initial data ( about 2 MB) in about 3 milliseconds, the same using DBFs/arrays in Xbase++ would take several some minutes.
gruss by OHR
Jimmy
Jimmy