Seite 2 von 2

Re: Simpler 32/64-Bit-Dis-Assembler in PB

Verfasst: 31.12.2010 15:30
von edel
Falls dir AddgadgetItem zu langsam ist, speichere alles in einem Array und lass es das Gadget selber auslesen.

Code: Alles auswählen

STRUCTURE Item
  ID.s
  Rnd.s
ENDSTRUCTURE

#item_count = 3000000

GLOBAL DIM daten.Item(#item_count - 1)

FOR i = 0 TO #item_count - 1
  daten(i)\ID = Str(i + 1) 
  daten(i)\Rnd = Str(Random(6666))
NEXT
  

PROCEDURE Callback(hwnd, msg, wparam, lparam)
  PROTECTED *hdr.NMHDR
  PROTECTED *di.NMLVDISPINFO
  
  IF msg = #WM_NOTIFY
    *hdr = lparam
    
    IF *hdr\code = #LVN_GETDISPINFO
      *di = lparam
      
      IF *di\item\iSubItem = 0
        str.i = @daten(*di\item\iItem)\ID
      ELSE
        str.i= @daten(*di\item\iItem)\Rnd
      ENDIF
            
      *di\item\pszText = str
      
      PROCEDURERETURN #True
    ENDIF
          
  ENDIF
  
  PROCEDURERETURN #PB_ProcessPureBasicEvents  
ENDPROCEDURE  

IF OpenWindow(0, 0, 0, 270, 140, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@Callback(), 0)
    
  ListIconGadget(0, 10, 10, 250, 120, "ID", 100, #LVS_OWNERDATA | #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(0,1, "rnd", 60)
  
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, #item_count, 0)  
  
  REPEAT : 
    
  UNTIL WaitWindowEvent() = #PB_Event_CloseWindow
  
ENDIF


Re: Simpler 32/64-Bit-Dis-Assembler in PB

Verfasst: 31.12.2010 19:50
von PureLust
Helle hat geschrieben:Hat jemand eine schnellere Alternativ-Lösung parat? Ich könnte es direkt per ASM im Speicher verwalten, aber meine Zielstellung war eben, weitestgehend PB zu verwenden.
Hab mir jetzt nicht Deinen Source genau angeschaut ob Du's eventuell schon benutzt, aber beim Füllen eines ListIconGadgets mit vielen Zeilen
hilft das Abschalten des Redrawings per "SendMessage_(GadgetID(0),#WM_SETREDRAW,#False,0)" extrem.

Im nachfolgenden Beispiel verringert sich dadurch die Füllzeit eines ListIconGadgets() mit 20.000 Einträge von 23,5 Sek. auf rund 1 Sek.:

Code: Alles auswählen

DisableDebugger

OpenWindow(0,0,0,300,300,"test")
ListIconGadget(0,0,0,300,300,"Debugged Code ...", 296)
;SendMessage_(GadgetID(0),#WM_SETREDRAW,#False,0)
start= ElapsedMilliseconds()
For n = 1 To 20000
	AddGadgetItem(0,-1,Str(n))
Next
stop = ElapsedMilliseconds()
;SendMessage_(GadgetID(0),#WM_SETREDRAW,#True,0)
EnableDebugger

Debug stop - start
Repeat
	event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
Falls Du's für Linux etc. ohne API machen möchtest könntest Du das ListIconGadget für die Zeit auch hiden - hat den gleichen Beschleunigungseffekt.

Gruß .... und guten Rutsch, :allright:
PL.

Re: Simpler 32/64-Bit-Dis-Assembler in PB

Verfasst: 01.01.2011 17:27
von Helle
Hallo,
erstmal euch allen ein gesundes neues Jahr!
@PureLust: Das hatte ich schon drin; ohne kann man es gleich vergessen. Aber Danke!
@edel: Jaaa :bounce: ! Nachdem heute mein Hirn wieder Willens war, halbwegs koordiniert zu funktionieren, habe ich Deinen Tipp für erste Tests eingebaut und siehe da, der Speed-Gewinn hat ca. den Faktor 8 (!). Wird natürlich fest eingebaut. Vielen Dank :praise: !
Gruß
Helle