Frage zu den Image ID's

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Frage zu den Image ID's

Beitrag von Bisonte »

Ich bin der Meinung gelesen zu haben (uh cooler konjunktiver Satz), das die gesamten IsObject Funktionen
genauso durchgearbeitet werden wie im SDK mit den PB_EnumerateObject.... also von Anfang bis Treffer oder nix.

Da war auch irgendwo ein Posting von Fred oder freak wo abgeraten wurde Is... zu benutzen, da diese viel Zeit kosten können....
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Frage zu den Image ID's

Beitrag von DarkSoul »

Aber das würde ja bedeuten, dass PB doch intern ein riesen-Dim-Array anlegt, wo dann alle Elemente durchlaufen werden müssten. for i = 0 to 9999999 dauert natürlich seine Zeit... :shock:

Ist das Array nicht eher assoziativ angelegt

0 -> objekt1
1 -> objekt2
9999999 -> objekt_pb_any

und bei jedem OpenXYZ kommt einfach ein Element hinten dran?

Das würde jetzt nicht sooo viel Performance kosten. Wenn man die jetzt in einem eigenen Array vorhält, dann geht das doch auch nicht viel schneller, es zu durchlaufen, um ein bestimmtes herauszupicken?

Edit: vergesst, was ich gerade geschrieben habe, da man ja bei nem Dim-Array direkt auf die Elemente zugreifen kann und keine Such-Schleife braucht..... :freak:
Bild
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Frage zu den Image ID's

Beitrag von #NULL »

Das sind bestimmt direkt Array Indices oder Map Keys.
Ansonsten einfach ausprobieren. Ich kann da keinen Geschwindigkeitsunterschied feststellen:

Code: Alles auswählen

If #PB_Compiler_Debugger
  MessageRequester("", "disable the debugger!")
  ;End
EndIf
OpenConsole()

t1 = 0
t2 = 0

alternatingCases = 1;00
maxPerCase = 500000000

win = OpenWindow(#PB_Any, 100, 100, 100, 100, "")
g1 = 0
g2 = 9999

For n=1 To alternatingCases
  
  ; ----------------------------------
  
  ButtonGadget(g1, 100, 100, 100, 100, "")
  While WindowEvent() : Wend
  
  t = ElapsedMilliseconds()
  For i=0 To maxPerCase
    If IsGadget(g1)
      dummy+1
    EndIf
  Next
  t = ElapsedMilliseconds()-t
  PrintN("case 1: " + t)
  t1 + t
  
  FreeGadget(g1)
  
  ; ----------------------------------
  
  ButtonGadget(g2, 100, 100, 100, 100, "")
  While WindowEvent() : Wend
  
  t = ElapsedMilliseconds()
  For i=0 To maxPerCase
    If IsGadget(g2)
      dummy+1
    EndIf
  Next
  t = ElapsedMilliseconds()-t
  PrintN("case 2: " + t)
  t2 + t
  
  FreeGadget(g2)
  
  ; ----------------------------------
  
Next

PrintN("")
PrintN("case 1 total: " + t1)
PrintN("case 2 total: " + t2)
Input()
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Frage zu den Image ID's

Beitrag von DarkSoul »

Hier sind es ca. 2ms Unterschied zwischen den beiden Durchläufen.

Wenn ich den zweiten ButtonGadget per #PB_Any erzeuge, dann sind es im zweiten Durchlauf schon 200ms mehr als vorher. /:->

Und dann gibt es eine Kuriosität:

Wenn ich im unveränderten Code die Variable g2 auf 999999 hochsetze, dann habe ich im ersten Durchlauf sogar 300ms mehr als zuvor, obwohl g2 zu dem Zeitpunkt noch gar nicht verwendet wird. Wie kommt das? :shock:

Zum Glück benutze ich diese IsX eigentlich nie in irgendwelchen Schleifen, die möglichst performant sein müssen. :mrgreen:

Wenn ich die erste Schleife auf das hier ändere, ist die übrigens auch 200ms langsamer, also denke ich, dass IsX doch recht peformant ist:

Code: Alles auswählen

For i=0 To maxPerCase
    a+1
    a+1
Next
Bild
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Frage zu den Image ID's

Beitrag von #NULL »

2ms unterschied ist erstens zuwenig um irgendwas zu bedeuten, und zweitens wertlos ohne die eigentichen Werte (1000ms zu 1002ms ?). alternatingCases sollte asserdem auf 1 bleiben, sonst wird der 1. testcase eventuell vom 2. testcase aus dem vorherigen Durchlauf beeinflusst.
Bei mir sind es auch ~10% Unterschied, aber mal ist ebene der eine Fall schneller und mal der andere.
Probier 999999 mal mit Debugger, der wird die sagen das er das nicht will und wahrscheinlich gar kein Gadget erstellen.
Zum Vergleich mit #PB_Any hab ich keine Ahnung.
Ist letztlich auch völlig schnuppe wie schnell IsGagdet() ist, erstrecht wenn man es garnicht verwendet.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten