Damit hab ich es getestet:
Local $hVarTimer = TimerInit()
Local Static $iShortLoop = 3000 / $iShortSleep
Local Static $iLongLoop = 120000 / $iShortSleep
Local $fDiffVar = TimerDiff($hVarTimer)
Static: 9757 Werte mean: 0,00764635308348 median: 0,006023459567979
Const: 6764 Werte mean: 0,007079269319721 median: 0,005722219377844
Komischerweise ist da Const eh schneller.
Beiträge von diepfeile
-
-
Danke für die Tipps. Da $iShortSleep angepasst werden kann (~50-500ms), möchte ich trotzdem, dass die Fehlermeldungen erst nach einer bestimmten Zeit triggern. So sieht die ganze Funktion aus:
ZitatFunc SleepUntilButtonExists($mMap, $bScroll = False)
Local $hVarTimer = TimerInit()
Local Static $iShortLoop = 3000 / $iShortSleep
Local Static $iLongLoop = 120000 / $iShortSleep
Local $fDiffVar = TimerDiff($hVarTimer)
;CW('$fDiffVar: ' & $fDiffVar)
IniWrite($sINI, 'SUBE Static', TimeStampMilliSeconds(), $fDiffVar)
Local $iLooped = 0
Do
$iLooped += 1
;If $bScroll = True And $iLooped > 1 Then MouseWheel('down', 1)
If $bScroll And $iLooped > 3 And Mod($iLooped,2) = 0 Then MouseWheel('down', 1)
If $iLooped > $iShortLoop Then CW($mMap.Name & ' $iLooped: ' & $iLooped)
If $iLooped > $iLongLoop Then
Send('{PRINTSCREEN}') ; Screenshot the Problem
KillFlash()
$iLooped = 0
MsgBox(0, 'SleepUntilButtonExists $iLooped > 120s: Terminated!', TimeStamp() & ' Screenshot taken' & @CRLF & ' PCS is: ' & my_PCS($mMap) & @CRLF & MapDisplay($mMap))
WinWaitActive($sBrowserTitle)
EndIf
Sleep($iShortSleep)
Until ButtonExists($mMap)
EndFunc ;==>SleepUntilButtonExistsEs als Code posten funktioniert nicht: https://www.bilder-upload.eu/bild-7433e7-1539961488.png.html
Ja, der Performancegewinn ist < ms, aber warum sollte ich ihn nicht mitnehmen, zudem summiert sich das ja auf? Dank Local sollte es ja nicht zu Kollisionen kommen können. Oder gehört das einfach zu good coding practices?
Not = ist auch aus irgendeinem Grund doppelt so schnell wie <>
Und bei rekursiv mit Funktionen vs interativ mit Array, merkt man schon deutlich was. Bei meinem Problem, die neuste Datei in einem Ordner finden waren das 10% weniger Zeit vs nur 10% RAM nutzen und das waren nur meine beiden besten Lösungen! -
Ich möchte am Anfang einer Funktion 2 Varibalen definieren, für den späteren Gebrauch:
$iShortLoop = 3000 / $iShortSleep
$iLongLoop = 120000/$iShortSleep
Meine erste Idee war einfach Global Const, aber Global sollte man ja vermeinen und sie werden auch nur in der einen Funktion genutzt.
Nur ist jetzt die Frage, ob ich Local, Const oder Static nutzen sollte.
Local brauch ich wohl nicht, da alle Variablen automatisch in Funktionen Local sind?
Aus anderen Scripts weiß ich, dass Static ein Perfomancegewinn bringt, da die Varibale nur einmal initialisiert wird.
Aber die Variablen werden sich nicht ändern, wodurch auch Const Sinn machen würde.
Welche Keywords macehn da Sinn zu verwenden?
-
Hmpf, schade. Ich hatte gehofft die Timestamp-vergleiche zu vermeiden und das einfach mit Timern zu lösen, da der Handle davon ja eh aussieht wie ein Timestamp. Naja danke für die Info.
-
Ich möchte erreichen dass mein Script alle paar stunden was tun kann. Nur kann es sein, da es mehrere Stunden sind, dass das Script in der Zeit aus war und neu gestartet wurde. Nur möchte ich das es für den Timer nicht gilt.
-
Eigentlich ist der Code recht gut formatiert, in der Eingabebox auch noch, aber dann komischerweise nicht mehr. Naja nochmal probieren:
AutoItLocal Static $hTimer = Int(IniRead(@TempDir & '\' & $sINI, 'Values', '$hTimer', Default)) ... $hTimer = TimerInit() IniWrite(@TempDir & '\' & $sINI, 'Values', '$hTimer', $hTimer)
Ich möchte nur, dass der Timer nach einem Neustarts des Skriptes noch funktioniert.
-
Ich probiere einen $hTimer in einer ini zu speichern, leider klappt das nicht:
CodeLocal Static $hTimer = Int(IniRead(@TempDir & '\' & $sINI, 'Values', '$hTimer', Default))... $hTimer = TimerInit() IniWrite(@TempDir & '\' & $sINI, 'Values', '$hTimer', $hTimer)
Das Probelm ist wohl, dass der Timer ein Handle und kein string oder integer ist? Aber ich weiß nicht wie ich das fixen soll.
-
Wo ist denn der Unterschied wenn man Shutdown() nutzt zwischen $SD_SHUTDOWN (1) = Shutdown und $SD_POWERDOWN (8) = Power down und was wenn man beide nutzt?
-
Zuerst habe ich es auch sauber mit .exists gemacht, musste dann aber leider feststellen, dass es immer True ist.
Dann kam auch noch raus, es geht auch mit = ““ und das noch schneller...
Habe nun beide Versionen und gucke mal was besser performt.
In theoretischen Tests gewinnt .exists ab 10k Ausführungen, vorausgesetzt das Abgefragte existiert nicht.
Ich komme bei weitem nicht auf so viele Anfragen, zudem kann bei mir die Variable ruhig kreiert werden, da ich kurz darauf in sie schreibe, die Sache ist nur, wenn ich zum ersten mal reinschreibe, muss es anders aussehen, als die weiteren male. Somit ist es recht egal, ob ich es mit .exists oder = ““ löse, oder nicht?
Zitatif daten schon drin Then ; .exists immer true
(tu nichts außer loggen)
Else
; schreib ich zum erstne mal rein? text entsprechend formatieren
; If .exists Then ; leider immer true weil wir ja schon geguckt haben ob daten drin sind, wodurch es ajf existiert
If Not = "" Then
var &= ... (befüllen alle weiteren male)
Else
var = ... (zum ersten mal befüllen)
EndIf
befüllung loggen
EndIfZitat; es geht auch mit .exists:
If .exists Then
If daten schon drin Then
(tu nichts außer loggen)
Else
var &= ... (befüllen alle weiteren male)
befüllung loggen
EndIf
Else
var.add ...
befüllung loggen
EndIfZitat, Code alles ist irgendwarum schlecht formatiert.
-
Hmh, find ich nicht *g, naja danke für die Info.
Hab nun mal die unterschiedlichen Abfragen auf Geschwindigkeit getestet.
.exists ist da, obwohl ja nichts kreiert wird, mit Abstand die langsamste:
Spoiler anzeigen
Zitat$oDict = ObjCreate("Scripting.Dictionary")
For $i = 0 To 999
$oDict(Random(100000, 999999, 1)) = Random(100000, 999999, 1)
Next
$iInt = 123456
$diff = 0
For $j = 0 To 9999
$timer = TimerInit()
;If $oDict.exists($iInt) Then ; 48
;If $oDict($iInt) <> '' Then ; 26
If Not $oDict($iInt) = '' Then ; 24
$blup = True
Else
$blup = False
EndIf
$diff += TimerDiff($timer)
;ConsoleWrite($diff & ' ' & $blup & @CRLF)
Next
$blup = $oDict.exists($iInt)
ConsoleWrite($diff & ' ' & $blup & @CRLF)Spoiler anzeigen
Zitat$oDict = ObjCreate("Scripting.Dictionary")
For $i = 0 To 999
$oDict(Random(100000, 999999, 1)) = Random(100000, 999999, 1)
Next
$iInt = 123456
For $j = 0 To 9
$timer = TimerInit()
;If $oDict.exists($iInt) Then ; 0,0060 0,0057
;If $oDict($iInt) <> '' Then ; 0,0039 0,0036
If Not $oDict($iInt) = '' Then ; 0,0033 0,0030
$blup = True
Else
$blup = False
EndIf
$diff += TimerDiff($timer)
ConsoleWrite($diff & ' ' & $blup & @CRLF)
Next
$blup = $oDict.exists($iInt)
ConsoleWrite(' ' & $blup & @CRLF)Die Zeiten die sich bei mir ergeben, hab ich hinter die If kommentiert. Fast doppelt so langsam!
-
Jo, das ist das Problem! Und das ist Working as intended?
-
Wofür sind die '/' am Anfang und am Ende? Zudem funktioniert das bei mir nicht, obwohl ich die '/' weggelassen habe und das fehlende 'z' ergänzt habe.
-
Das Problem ist doch, obwohl kein der Eintrag nicht existiert, macht die Abfrage danach ihn schon True.
-
Der Code funktioniert nicht so wie ich mir das erhofft habe:
Zitat$sItem = '123'
$oDictionary = ObjCreate("Scripting.Dictionary")
ConsoleWrite('$oDictionary.Exists($sItem): ' & $oDictionary.Exists($sItem) & @CRLF)
ConsoleWrite('$oDictionary($sItem): ' & $oDictionary($sItem) & @CRLF)
ConsoleWrite('$oDictionary.Exists($sItem): ' & $oDictionary.Exists($sItem) & @CRLF)
ConsoleWrite('$oDictionary($sItem): ' & $oDictionary($sItem) & @CRLF)
If $oDictionary($sItem) = '' Then ConsoleWrite('empty' & @CRLF)Das ist das Output:
Zitat$oDictionary.Exists($sItem): False
$oDictionary($sItem):
$oDictionary.Exists($sItem): True
$oDictionary($sItem):
emptySollte es nicht False bleiben, weil ich ja noch nichts hineingeschrieben habe?
-
Ich zitiere mal Wikipedia:
Bei FileGetSize und FileMove funktioniert es, aber DirRemove scheint es nicht zu klappen.
Selbst im Testscript nicht, die Ordner werden erstellt, aber nicht wieder gelöscht, obwohl error und extended je 0 sind.
Code$dir = "\\?\" & @WorkingDir DirCreate($dir & "\blup\test") DirRemove($dir & "\blup",1) ; klappt nicht ;DirRemove(@WorkingDir & "\blup",1) ; klappt MsgBox(0, "", "Value of @error is: " & @error & @CRLF & "Value of @extended is: " & @extended)
Funktioniert nur bis unter 255zeichen die restlichen Ordner fehlen sonst:
Code$dir = "\\?\" & @WorkingDir DirCreate($dir & "\123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m\123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m\123456789a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789k123456789l123456789m")
-
Ich habe den Eindruck, dass bei FileGetSize die Pfad- und Dateinamenlänge zusammen nicht 255 Zeichen überschreiten darf. Auf jeden Fall gehts bei 241 Zeichen noch, bei 273 aber nicht mehr. Was kann man da machen, um auch die Größe von Dateien herauszubekommen die längere Pfade haben?
-
" MozRepl not working in version 20" die sind der gleichen Meinung wie ich. Nur weil da nichts von nem Fork oder einer Alternative steht, bedeutet das ja nicht das es keine gibt.
-
Früher ging es einwandfrei.
Tools>Mozrepl>Start hab ich geklickt, ka ob da dann wenn es funktioniert ein Haken vor sein muss. Ist ajf nicht.
Jetzt scheitert es ja schon an:Code_FFConnect("127.0.0.1", 4242) If @error Then MsgBox(64, "Fail", "Can't connect to FireFox!") Exit EndIf
Man startet das Script, lange passiert nichts, dann kommt die Messagebox und dann das steht inner Konsole:
Code
Alles anzeigen>Running:(3.3.8.1):C:\Program Files (x86)\AutoIt3\autoit3.exe "R:\test.au3" --> Press Ctrl+Alt+F5 to Restart or Ctrl+Break to Stop _FFConnect: OS: WIN_7 WIN32_NT 7601 Service Pack 1 _FFConnect: AutoIt: 3.3.8.1 _FFConnect: FF.au3: 0.6.0.1b-3 _FFConnect: IP: 127.0.0.1 _FFConnect: Port: 4242 _FFConnect: Delay: 2ms _FFConnect ==> Timeout: TCPConnect Error: 10061 _FFConnect ==> General Error: Timeout: Can not connect to FireFox/MozRepl on: 127.0.0.1:4242 +>19:34:30 AutoIT3.exe ended.rc:0 >Exit code: 0 Time: 67.243
Ich glaub die 1.1 mozrepl version versteht sich nicht mit dem neuen FF20. Wobei wir wieder bei der ersten Frage wären: Gibt es irgendwo eine funktionierende Version von Mozrepl oder eine Alternative?
-
Hab ich ja gemacht. Aber wenn ich dann zu ihm verbinden will gehts es nicht mehr, liegt glaub ich mit der neuen Firefox version 20 zusammen.
-
Gibt es irgendwo eine funktionierende Version von Mozrepl oder eine Alternative?