Das mit dem Handle sollte kein Problem darstellen.
AutoIt kommt damit klar.
Ob er nun den Titel einträgt oder erst das Handle über den Fenstertitel bestimmt und dieses dann einträgt ist prinzipiell egal.
Wenn aber ControlSend eingesetzt wird dann sollte man auch angeben welches Control aus dem Fenster gemeint ist anstatt diesen Parameter leer zu lassen.
Sehe das wie Xeno - erstmal mit ControlSetText testen - das ist das sicherste.
Erst wenn das nicht geht auf ControlSend oder Send ausweichen.
Beiträge von AspirinJunkie
-
-
Hier nochmal eine ausführliche Erklärung zur Rekursion: >>Rekursion<<
-
Lies dir mal die Startseite von autoit.de gaaaaaanz genau durch....
-
Wie Oscar schon sagte ist das ReDim das Problem.
Optimierungen müssten also in die Richtung gehen diese zu minimieren.
Also vorstellbar wäre das z.b. in jedem Verzeichnis erst gezählt wird wie viele Dateien vorhanden sind und für alle ein entsprechend groß dimensioniertes ReDim durchgeführt wird.
Eine deutlich schnellere aber nicht empfehlenswerte Variante wäre aber noch ein Array schon ausreichend groß zu dimensionieren (sagen wir mal 50.000 Elemente) und erst am Ende das auf die entsprechende Größe zu runterzu-"ReDimmen" ( ) so das man nur ein einziges ReDim durchführt.
Davon ist allerdings abzuraten wegen der sinnlosen Speicherverschwendung und für den Fall das es mal mehr Elemente werden als die 50.000.
Aber allemal interessant um den Geschwindigkeitsunterschied zu sehen... -
Also wenn´s wirklich nur auf eine Auflistung aller Dateien geht dann bekomm ich meins auch noch ein ganzes Stückchen schneller:
Spoiler anzeigen
[autoit]Global $fpath = 'C:\'
[/autoit] [autoit][/autoit] [autoit]$start = TimerInit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $FileList = _FileListToArrayList($fpath)
$diff = TimerDiff($start)
_ArrayListDisplay($FileList)
MsgBox(0,"", Round($diff/1000, 3) & ' sek. / ' & $FileList.count & ' Dateien')Func _FileListToArrayList($Path)
[/autoit] [autoit][/autoit] [autoit]
Local $SHandle, $File
Local $ArrayList = ObjCreate("System.Collections.ArrayList")
If @error Or Not IsObj($ArrayList) Then Return SetError(1, 1, 0)
If Not FileExists($Path) Then Return SetError(2, 2, $ArrayList)
SplashTextOn('Recursive FileList', $Path, 800, 50, -1, -1, 36)
$SHandle = FileFindFirstFile($Path & '*.*')
If @error Then Return SetError(3, 3, $ArrayList)
Do
$File = FileFindNextFile($SHandle)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($Path & $File), 'D') Then
_FileListToArrayListExtended($Path & $File & '\', $ArrayList)
Else
$ArrayList.add($Path & $File)
EndIf
Until 0
FileClose($SHandle)
SplashOff()
Return $ArrayList
EndFuncFunc _FileListToArrayListExtended($Path, ByRef $ArrayList)
[/autoit] [autoit][/autoit] [autoit]
Local $Folder
ControlSetText('Recursive FileList', '', 'Static1', ' ' & $Path)
$SHandle = FileFindFirstFile($Path & '*.*')
If @error Then Return SetError(3, 3, $ArrayList)
Do
$File = FileFindNextFile($SHandle)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($Path & $File), 'D') Then
_FileListToArrayListExtended($Path & $File & '\', $ArrayList)
Else
$ArrayList.add($Path & $File)
EndIf
Until 0
FileClose($SHandle)
EndFuncFunc _ArrayListDisplay(ByRef $ArrayList)
[/autoit]
Local $Opt = Opt("GUIOnEventMode", 0)
Local $GUI = GUICreate("ArrayList", 572, 536)
Local $Edit = GUICtrlCreateEdit("", 8, 8, 553, 481)
Local $Button = GUICtrlCreateButton("O.k.", 208, 496, 121, 33, 0)
Local $counter = 1
Local $String
For $e In $ArrayList
$String &= StringFormat("% 6d %s", $counter, $e) & @CRLF
$counter += 1
Next
GUICtrlSetData($Edit, $String)
GUISetState(@SW_SHOW)
Do
Switch GUIGetMsg()
Case - 3
ExitLoop
Case $Button
ExitLoop
EndSwitch
Until 0
GUIDelete($GUI)
Opt("GUIOnEventMode", $Opt)
EndFunc
Wobei mir deine Variante bei der Ausgabe besser gefällt da dort immer erst die Dateien und dann die Ordner angezeigt werden.
Könnte ich auch noch machen - würde aber Speed fressen...Mir persönlich ist aber meine erste Version noch am liebsten da man dort ja noch flexibel ist ob man nur Ordner oder Dateien oder beides haben möchte.
Außerdem kann man ja noch einen Filter einsetzen. -
Hatte vorhin noch einen Hinweis mit dazu geschrieben :
Hinweis: Die _ArrayListDisplay-Funktion kann momentan nur rund 4000 Elemente anzeigen.
Nicht wundern also wenn anscheinend zu wenig Elemente gefunden wurden - in der ArrayList selbst sind alle vorhanden.Die AutoIt eigene Funktion GUICtrlCreateListViewItem scheint auf eine bestimmte Anzahl an Elementen beschränkt zu sein.
Könnte man wie es bei ArrayDisplay auch gemacht wurde auf _GUICtrlListView_InsertItem ausweichen.
War aber eh nur schnell als Beispiel geschrieben um eine ArrayList zu visualisieren.
Prinzipiell sollte man aber auch hier wegen des Memory-Leaks von AutoIt bei Objektvariablen überlegen ob man die ArrayList und das FileSystemObject global erstellt, anstatt lokal und dann als Parameter übergibt, wenn man die Funktion mehrmals aufrufen will. -
Oscar
Die Performance-Bremse ist prinzipiell das Array selbst.
Jedesmal wenn per _ArrayAdd ein Element hinzugefügt wird muss ein neuer Bereich im Speicher allokiert werden welcher Platz für das nun größer gewordene Array bietet.
Dann muss das gesamte Array in diesen Speicherbereich kopiert werden.
Jedesmal
Je mehr Elemente im Array sind umso länger dauert die Prozedur.
Deswegen schlage ich vor in diesem Fall auf eine andere Datenstruktur als ein Array auszuweichen.
Eine dynamische Datenstruktur bei welcher die Elemente nicht hintereinander im Speicher stehen müssen sondern frei verteilt sein können und damit problemlos Elemente hinzugefügt oder entfernt werden können.
Hab dafür eine ArrayList genommen:Spoiler anzeigen
[autoit]Global $fpath = @HomeDrive & '\'
[/autoit] [autoit][/autoit] [autoit]Global $FileList = _FileListToArrayList($fpath, '*', 0)
[/autoit] [autoit][/autoit] [autoit]
If Not @error Then _ArrayListDisplay($FileList)
;===============================================================================
;
; Description: lists all files and folders recursive in a specified path
; Syntax: _FileListToArrayList($Path, $Filter = "*", $Flag = 0)
; Parameter(s): $Path = Path to generate filelist for
; $Filter = The filter to use. Search the Autoit3 manual for the word "WildCards" For details
; $Flag = determines weather to return file or folders or both
; $iFlag=0(Default) Return both files and folders
; $iFlag=1 Return files Only
; $iFlag=2 Return Folders Only
; $CaseSensitive = casesensitive Filter - True or False
;
; Requirement(s): .Net-FrameWork
; Return Value(s): On Success - Returns an Array-List Object containing the list of files and folders in the specified path
; On Failure - Returns the an empty string "" if no files are found and sets @Error on errors
; @Error=1 Failure Creating the ArrayList-Object
; @Error=2 Failure Creating the FileSystem-Object
; @Error=3 Invalid $Flag
; @Error=4 $Path don´t exists
;
; Author(s): AspirinJunkie <AspirinJunkie at german-nlite dot de>
; Note(s): -
;===============================================================================Func _FileListToArrayList($Path, $Filter = '*', $Flag = 0, $CaseSensitive = False)
[/autoit] [autoit][/autoit] [autoit]
Local $Replaces[8][2] = [['.', '\.' ], ['*', '.*' ], ['?', '.' ], ['+', '\+' ], ['-', '\-' ], ['(', '\(' ], [')', '\)' ], ['[', '\[' ]]
Local $Folder, $e, $Case
Local $ArrayList = ObjCreate("System.Collections.ArrayList")
If @error Or Not IsObj($ArrayList) Then Return SetError(1, 1, 0)
Local $FSObj = ObjCreate('Scripting.FileSystemObject')
If @error Or Not IsObj($ArrayList) Then Return SetError(2, 2, 0)
If Not ($Flag = 0 Or $Flag = 1 Or $Flag = 2) Then Return SetError(3, 3, '')
If Not $FSObj.FolderExists($Path) Then Return SetError(4, 4, '')
SplashTextOn('Recursive FileList', $Path, 800, 50, -1, -1, 36)
For $i = 0 To 7
$Filter = StringReplace($Filter, $Replaces[$i][0], $Replaces[$i][1])
Next
If Not $CaseSensitive Then $Case = '(?i)'
If StringRight($Path, 1) <> '\' Then $Path &= '\'
$Folder = $FSObj.GetFolder($Path)
If $Flag < 2 Then
For $e In $Folder.Files
If StringRegExp($e.Name, $Case & $Filter) Then $ArrayList.add($Path & $e.Name)
Next
EndIf
For $e In $Folder.SubFolders
If $Flag <> 1 Then
If StringRegExp($e.Name, $Case & $Filter) Then $ArrayList.add($Path & $e.Name)
EndIf
_FileListToArrayListExtended($Path & $e.Name & '\', $Filter, $Flag, $Case, $ArrayList, $FSObj )
Next
SplashOff()
Return $ArrayList
EndFunc ;==>_FileListToArrayListFunc _FileListToArrayListExtended($Path, $Filter, $Flag, $Case, ByRef $ArrayList, ByRef $FSObj)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $Folder
ControlSetText('Recursive FileList', '', 'Static1', ' ' & $Path)
$Folder = $FSObj.GetFolder($Path)
If $Flag < 2 Then
For $e In $Folder.Files
If StringRegExp($e.Name, $Case & $Filter) Then $ArrayList.add($Path & $e.Name)
Next
EndIf
For $e In $Folder.SubFolders
If $Flag <> 1 Then
If StringRegExp($e.Name, $Case & $Filter) Then $ArrayList.add($Path & $e.Name)
EndIf
_FileListToArrayListExtended($Path & $e.Name & '\', $Filter, $Flag, $Case, $ArrayList, $FSObj)
Next
EndFunc ;==>_FileListToArrayListExtended
;===============================================================================Func _ArrayListDisplay(ByRef $ArrayList)
[/autoit] [autoit][/autoit] [autoit]
Local $Opt = Opt("GUIOnEventMode", 0)
Local $GUI = GUICreate("ArrayList", 572, 536)
Local $ListView = GUICtrlCreateListView("Element|Wert", 8, 8, 553, 481)
Local $Button = GUICtrlCreateButton("O.k.", 208, 496, 121, 33, 0)
Local $counter = 1For $e In $ArrayList
[/autoit]
GUICtrlCreateListViewItem($counter & '|' & $e, $ListView)
$counter += 1
Next
GUISetState(@SW_SHOW)
Do
Switch GUIGetMsg()
Case -3
ExitLoop
Case $Button
ExitLoop
EndSwitch
Until 0
GUIDelete($GUI)
Opt("GUIOnEventMode", $Opt)
EndFuncHinweis: Die _ArrayListDisplay-Funktion kann momentan nur rund 4000 Elemente anzeigen.
Nicht wundern also wenn anscheinend zu wenig Elemente gefunden wurden - in der ArrayList selbst sind alle vorhanden. -
Woher weißt du denn das das Shockwave-Objekt die Funktion "navigate" besitzt?
Zu jedem möglichen COM-Objekt sollte es auch eine Referenz dazu geben - um diese jeweils durchzulesen wirst du nicht herumkommen. -
Bei der Funktion ArraySort() musst du beim 3. Parameter ($Base) eine 1 eintragen - das heißt das erst ab diesem Element (dem 2.) sortiert wird.
Bei deinem Array hat das erste Element ja eine Sonderfunktion, nämlich die Anzahl der Dateien anzugeben.
Dieses wurde dann aber mit sortiert und mit großer Wahrscheinlichkeit rückte an erste Stelle nun irgendein String welcher als Zahlenwert 0 entspricht.
Das heißt deine For - Schleife geht dann von $i=1 bis 0 - also wird gar nicht erst ausgeführt.
Also wie gesagt: 3. Parameter muss 1 sein. -
Schau mal im Menü oben im Punkt "Tools" bzw. "Extras" in der deutschen Version ob du den Punkt "Compile" findest - nur dann geht es.
Wenn dieser Punkt nicht da ist und du tatsächlich Scite4AutoIt installiert hast dann bearbeitest du mit Scite gerade keine .au3-Datei.
Die zu bearbeitende Datei muss vom Dateityp ".au3" sein - nur dann funktioniert das. -
Hast du das normale Scite oder die auf AutoIt angepasste Version >>Scite4AutoIt<< , bzw. überhaupt AutoIt installiert?
-
Kannst mir ruhig glauben: DegToRad = Pi / 180 da:
360° = 2 * Pi rad
--->
1° = (Pi / 180) radalso bedeutet die Einheit ° nichts weiter als (Pi / 180) - und damit muss demnach dein Gradbetrag multipliziert werden um zur Einheit radiant zu kommen.
BugFix :
Das ist aber die Gleichung für den Kreissektor - er wollte doch aber das Kreissegment - oder?monkey - so sollte es funktionieren:
Spoiler anzeigen
[autoit]Global Const $PI = 3.14159265358979
[/autoit] [autoit][/autoit] [autoit]
Const $DegToRad = $PI / 180func flaeche_kreissegmentR($r, $alpha)
[/autoit] [autoit][/autoit] [autoit]
Return ($r ^ 2) * ((($Pi * $alpha) / 360) - Sin($DegToRad * $alpha) / 2 )
EndFuncmsgbox(0, "Ergebnis", "Das Kreissegment hat eine Größe von "& flaeche_kreissegmentR(9,180))
[/autoit]Edit: BugFix : Oh sorry - hab überlesen das du das bewusst gemacht hast mit dem Kreissektor
-
Also wenn dann bräuchte er schon die Funktion _Radian($nDegrees) ....
-
Der Winkel wird nicht in Grad sondern in Radiant angegeben.
Radiant = Winkel [°] * (Pi / 180°)
-
Die Abweichungen sind bei dir deutlich zu krass - die Messdaten sind in dem Fall quasi nutzlos um eine vernünftige Aussage zu treffen.
Die Reihenfolge ist bei mir aber gleich, nur Oscar und Xeno deren Werte fast identisch sind sind vertauscht.
Deshalb kann ich mir die Ergebnisse gerade von Xeno´s Skript bei progandy nicht wirklich erklären ( @progandy - hast du die Implementierung so übernommen oder noch was geändert?).
Zumindestens zeigt es das die Werte natürlich in Abhängigkeit des Systems schwanken.
Also hier mal meine Ergebnisse dazu mit vernünftigeren Standardabweichungen:autoit.de/wcf/attachment/1842/
P.S.: @mega - mal keine falsche Bescheidenheit - dein Skript ist zumindestens bei mir das performanteste
-
Exakt das ist ja das Grundkonzept meines Skriptes
Aber auch wenn man nur mehrmals durchlaufen lässt und Durchschnitt bildet hat man keinen blassen Schimmer wie genau die Ergebnisse sind.
Deswegen berechne ich ja noch extra die Standardabweichung um die Messergebnisse auch qualitativ bewerten zu können. -
Hab mal den Geschwindigkeitsvergleich für diesen Contest gemacht:
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#Include <GuiListView.au3>
#include <array.au3>#region Variablen definieren
[/autoit] [autoit][/autoit] [autoit]
Global $ZeitErgebnisse = ObjCreate("System.Collections.ArrayList")
If @error Then
MsgBox(0, "", "Fehler bei der Objekt-Erstellung")
Exit
EndIfGlobal $TimerDiffTime
[/autoit] [autoit][/autoit] [autoit]
Global $Name, $Zeitsumme, $Zeitquadratsumme, $ZeitPunkt, $Zeit, $TempArray[3], $N, $X
Global $GUI, $ListView, $Button, $eins, $e, $RahmenZeit
#endregion;------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;Anzahl der Messdurchläufe angeben - je höher N umso genauer wird die gemessene Zeitangabe:
Global $N = 3000
;------------------------------------------------------------------------------------------#region Zeitaufwand der Methode bestimmen
[/autoit] [autoit][/autoit] [autoit]
$Name = "Oscar"
$Zeitquadratsumme = 0
$Zeitsumme = 0
SplashTextOn("Test der Methode:", @CRLF & $Name, 250, 60)For $XXX = 1 To $N
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ZeitPunkt = TimerInit()
;---------Code-----------
Global $z, $t = ' 01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849'
For $i = 0 To 6
$r = Random(1, 49 - $i, 1) * 2
$z &= StringMid($t, $r, 2) & StringLeft(' | ', 2 + ($i = 5) * 4)
$t = StringMid($t, 1, $r - 1) & StringMid($t, $r + 2)
Next
;------------------------
$Zeit = TimerDiff($ZeitPunkt)
$Zeitsumme += $Zeit
$Zeitquadratsumme += $Zeit ^ 2
Next
$TempArray[0] = $Name
$TempArray[1] = $Zeitsumme / $N
$TempArray[2] = Sqrt((($N * $Zeitquadratsumme) - ($Zeitsumme ^ 2)) / ($N * ($N - 1)))
$ZeitErgebnisse.add ($TempArray)
SplashOff()
#endregion#region Zeitaufwand der Methode bestimmen
[/autoit] [autoit][/autoit] [autoit]
$Name = "GTASpider"
$Zeitquadratsumme = 0
$Zeitsumme = 0
SplashTextOn("Test der Methode:", @CRLF & $Name, 250, 60)For $XXX = 1 To $N
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ZeitPunkt = TimerInit()
;---------Code-----------
Local $a[49], $sR, $sT, $rnd
For $i = 1 To 49
$a[$i - 1] = $i
Next
Do
$i += Assign("rnd", Random(0, 48))
$sR &= $a[$rnd] & ","
$a[$rnd] = ''
Until $i > 55
While $sT = ''
$sT = $a[Random(0, 48) ]
WEnd
$z = StringTrimRight($sR, 1) & "|" & $sT
;------------------------
$Zeit = TimerDiff($ZeitPunkt)
$Zeitsumme += $Zeit
$Zeitquadratsumme += $Zeit ^ 2
Next
$TempArray[0] = $Name
$TempArray[1] = $Zeitsumme / $N
$TempArray[2] = Sqrt((($N * $Zeitquadratsumme) - ($Zeitsumme ^ 2)) / ($N * ($N - 1)))
$ZeitErgebnisse.add ($TempArray)
SplashOff()
#endregion#region Zeitaufwand der Methode bestimmen
[/autoit] [autoit][/autoit] [autoit]
$Name = "BugFix 1"
$Zeitquadratsumme = 0
$Zeitsumme = 0
SplashTextOn("Test der Methode:", @CRLF & $Name, 250, 60)For $XXX = 1 To $N
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ZeitPunkt = TimerInit()
;---------Code-----------
Global $a[7] = [0, 0, 0, 0, 0, 0, 0]
Do
$X = Random(1, 49, 1)
For $i = 0 To UBound($a) - 1
If $a[$i] > 0 And $a[$i] = $X Then ExitLoop
If $a[$i] = 0 Then
$a[$i] = $X
ExitLoop
EndIf
Next
Until $a[UBound($a) - 1] <> 0
$z = $a[0] & ' ' & $a[1] & ' ' & $a[2] & ' ' & $a[3] & ' ' & $a[4] & ' ' & $a[5] & ' Z: ' & $a[6]
;------------------------
$Zeit = TimerDiff($ZeitPunkt)
$Zeitsumme += $Zeit
$Zeitquadratsumme += $Zeit ^ 2
Next
$TempArray[0] = $Name
$TempArray[1] = $Zeitsumme / $N
$TempArray[2] = Sqrt((($N * $Zeitquadratsumme) - ($Zeitsumme ^ 2)) / ($N * ($N - 1)))
$ZeitErgebnisse.add ($TempArray)
SplashOff()
#endregion#region Zeitaufwand der Methode bestimmen
[/autoit] [autoit][/autoit] [autoit]
$Name = "Xenobiologist"
$Zeitquadratsumme = 0
$Zeitsumme = 0
SplashTextOn("Test der Methode:", @CRLF & $Name, 250, 60)For $XXX = 1 To $N
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ZeitPunkt = TimerInit()
;---------Code-----------
Global $z = ' ', $B = ''
Do
$B = Random(1, 49, 1)
If Not StringRegExp($z, '(?<= )' & $B & '(?= )') Then $z &= $B & ' '
Until StringInStr($z, ' ', 0,
$z = 'Lottoziehung ' & @TAB & ':' & StringTrimRight($z, 3) & @CRLF & 'Zusatzzahl ' & @TAB & ': ' & StringRight($z, 3) & @CRLF & 'Superzahl' & @TAB & @TAB & ': ' & Random(1, 9, 1) & @CRLF
;------------------------
$Zeit = TimerDiff($ZeitPunkt)
$Zeitsumme += $Zeit
$Zeitquadratsumme += $Zeit ^ 2
Next
$TempArray[0] = $Name
$TempArray[1] = $Zeitsumme / $N
$TempArray[2] = Sqrt((($N * $Zeitquadratsumme) - ($Zeitsumme ^ 2)) / ($N * ($N - 1)))
$ZeitErgebnisse.add ($TempArray)
SplashOff()
#endregion#region Zeitaufwand der Methode bestimmen
[/autoit] [autoit][/autoit] [autoit]
$Name = "BugFix 2"
$Zeitquadratsumme = 0
$Zeitsumme = 0
SplashTextOn("Test der Methode:", @CRLF & $Name, 250, 60)For $XXX = 1 To $N
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ZeitPunkt = TimerInit()
;---------Code-----------
Global $str = '', $B = 0, $sum = 0, $a[49] = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656]
Do
$r = Random(0, 48, 1)
If Not BitAND($sum, $a[$r]) Then
$sum = BitOR($sum, $a[$r])
If $B < 6 Then $str &= $r + 1 & ' '
If $B = 6 Then $str &= ' Z: ' & $r + 1
$B += 1
EndIf
Until $B = 7
;------------------------
$Zeit = TimerDiff($ZeitPunkt)
$Zeitsumme += $Zeit
$Zeitquadratsumme += $Zeit ^ 2
Next
$TempArray[0] = $Name
$TempArray[1] = $Zeitsumme / $N
$TempArray[2] = Sqrt((($N * $Zeitquadratsumme) - ($Zeitsumme ^ 2)) / ($N * ($N - 1)))
$ZeitErgebnisse.add ($TempArray)
SplashOff()
#endregion#region Zeitaufwand der Methode bestimmen
[/autoit] [autoit][/autoit] [autoit]
$Name = "PhilRip"
$Zeitquadratsumme = 0
$Zeitsumme = 0
SplashTextOn("Test der Methode:", @CRLF & $Name, 250, 60)For $XXX = 1 To $N
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ZeitPunkt = TimerInit()
;---------Code-----------
Dim $lotto[7]
For $i = 0 To 5
$ran = Random(1, 49, 1)
If _ArraySearch($lotto, $ran) = 1 Then
$i -= 1
Else
$lotto[$i] = $ran
EndIf
Next
$lotto[6] = Random(1, 9, 1)
;------------------------
$Zeit = TimerDiff($ZeitPunkt)
$Zeitsumme += $Zeit
$Zeitquadratsumme += $Zeit ^ 2
Next
$TempArray[0] = $Name
$TempArray[1] = $Zeitsumme / $N
$TempArray[2] = Sqrt((($N * $Zeitquadratsumme) - ($Zeitsumme ^ 2)) / ($N * ($N - 1)))
$ZeitErgebnisse.add ($TempArray)
SplashOff()
#endregion#region Auswerten und Vergleichen
[/autoit] [autoit][/autoit] [autoit]
_ArrayListSort2Dim($ZeitErgebnisse, 1, 0)$eins = $ZeitErgebnisse.Item (0)
[/autoit] [autoit][/autoit] [autoit]$GUI = GUICreate("Ergebnisse", 633, 307, 193, 115)
[/autoit] [autoit][/autoit] [autoit]
$ListView = GUICtrlCreateListView("Name|Zeit [ms]|Verhältnis|Standardabweichung [ms]|rel. Abweichung", 0, 0, 632, 265)
$Button = GUICtrlCreateButton("O.K.", 240, 272, 121, 33, 0)_GUICtrlListView_SetColumnWidth ($ListView, 0, 203)
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_SetColumnWidth ($ListView, 1, 100)
_GUICtrlListView_SetColumnWidth ($ListView, 2, 75)
_GUICtrlListView_SetColumnWidth ($ListView, 3, 150)
_GUICtrlListView_SetColumnWidth ($ListView, 4, 100)For $e In $ZeitErgebnisse
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateListViewItem($e[0] & '|' & Round($e[1], 3) & '|' & Round($e[1] / $eins[1], 1) & '|' & Round($e[2], 4) & '|' & Int(100 * $e[2] / $e[1]) & '%', $ListView)
NextGUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button
Exit
EndSwitch
WEnd
#endregion;Sortiert eine ArrayList mit enthaltenem Array nach einem Index dieses Arrays im Selection-Sort-Algorithmus
[/autoit] [autoit][/autoit] [autoit]
;Author: [email='AspirinJunkie@german-nlite.de'][/email]
Func _ArrayListSort2Dim(ByRef $ArrayList, $DimIndex, $Descending = 0)
Local $minIndex[2], $SortValueIf Not IsObj($ArrayList) Then Return SetError(1, 1, 0)
[/autoit] [autoit][/autoit] [autoit]
If $ArrayList.count = 0 Then Return SetError(2, 2, 0)
$SortValue = $ArrayList.Item (0)
If UBound($SortValue) <= $DimIndex Then Return SetError(3, 3, 0)
If $ArrayList.count < 2 Then Return SetError(4, 4, 0)
For $i = 0 To $ArrayList.count - 1
$SortValue = $ArrayList.Item ($i)
$SortValue = $SortValue[$DimIndex]$minIndex[0] = $i
[/autoit] [autoit][/autoit] [autoit]
$minIndex[1] = $SortValueFor $e = $i + 1 To $ArrayList.count - 1
[/autoit] [autoit][/autoit] [autoit]
$SortValue = $ArrayList.Item ($e)
$SortValue = $SortValue[$DimIndex]If $SortValue < $minIndex[1] Then
[/autoit] [autoit][/autoit] [autoit]
$minIndex[0] = $e
$minIndex[1] = $SortValue
EndIf
NextIf Not ($minIndex[0] = $i) Then
[/autoit]
$ArrayList.Insert ($i, $ArrayList.Item ($minIndex[0]))
$ArrayList.Insert ($minIndex[0] + 1, $ArrayList.Item ($i + 1))
$ArrayList.RemoveAt ($minIndex[0] + 2)
$ArrayList.RemoveAt ($i + 1)
EndIf
Next
If $Descending Then $ArrayList.Reverse
Return 1
EndFuncMcPoldy´s Skript brachte einen Fehler und progandy´s Skript blieb bei mir hängen weswegen ich die beiden rausgelassen habe.
-
Naja also um die reine Geschwindigkeit eines Skriptes zu messen hab ich mir vor Ewigkeiten schon ein Skript geschrieben welches auch Rückschlüsse auf die Genauigkeit der Zeitmessung zulässt:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstants.au3>
#Include <GuiListView.au3>#region Variablen definieren
[/autoit] [autoit][/autoit] [autoit]
Global $ZeitErgebnisse = ObjCreate("System.Collections.ArrayList")
If @error Then
MsgBox(0,"", "Fehler bei der Objekt-Erstellung")
Exit
EndIfGlobal $TimerDiffTime
[/autoit] [autoit][/autoit] [autoit]
Global $Name, $Zeitsumme, $Zeitquadratsumme, $ZeitPunkt, $Zeit, $TempArray[3], $N, $i
Global $GUI, $ListView, $Button, $eins, $e, $RahmenZeit
#endregion;------------------------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;Anzahl der Messdurchläufe angeben - je höher N umso genauer wird die gemessene Zeitangabe:
Global $N = 100
;------------------------------------------------------------------------------------------#region Zeitaufwand der Methode bestimmen
[/autoit] [autoit][/autoit] [autoit]
$Name = "Test"
$Zeitquadratsumme = 0
$Zeitsumme = 0
SplashTextOn("Test der Methode:", @CRLF & $Name, 250, 60)For $i = 1 To $N
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$ZeitPunkt = TimerInit()
;---------Code-----------
Local $a
$a = 1
;------------------------
$Zeit = TimerDiff($ZeitPunkt)
if $i < 3 Then ContinueLoop
$Zeitsumme += $Zeit
$Zeitquadratsumme += $Zeit^2
Next
$TempArray[0] = $Name
$TempArray[1] = $Zeitsumme / $N
$TempArray[2] = Sqrt((($N * $Zeitquadratsumme) - ($Zeitsumme^2)) / ($N* ($N - 1)))
$ZeitErgebnisse.add($TempArray)
SplashOff()
#endregion#region Auswerten und Vergleichen
[/autoit] [autoit][/autoit] [autoit]
_ArrayListSort2Dim($ZeitErgebnisse, 1, 0)$eins = $ZeitErgebnisse.Item(0)
[/autoit] [autoit][/autoit] [autoit]$GUI = GUICreate("Ergebnisse", 633, 307, 193, 115)
[/autoit] [autoit][/autoit] [autoit]
$ListView = GUICtrlCreateListView("Name|Zeit [ms]|Verhältnis|Standardabweichung [ms]|rel. Abweichung", 0, 0, 632, 265)
$Button = GUICtrlCreateButton("O.K.", 240, 272, 121, 33, 0)_GUICtrlListView_SetColumnWidth($ListView, 0, 203)
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_SetColumnWidth($ListView, 1, 100)
_GUICtrlListView_SetColumnWidth($ListView, 2, 75)
_GUICtrlListView_SetColumnWidth($ListView, 3, 150)
_GUICtrlListView_SetColumnWidth($ListView, 4, 100)For $e In $ZeitErgebnisse
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateListViewItem($e[0] & '|' & Round($e[1], 3) & '|' & Round($e[1] / $eins[1], 1) & '|' & Round($e[2], 4) & '|' & Int(100 * $e[2] / $e[1]) & '%', $ListView)
NextGUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button
Exit
EndSwitch
WEnd
#endregion;Sortiert eine ArrayList mit enthaltenem Array nach einem Index dieses Arrays im Selection-Sort-Algorithmus
[/autoit] [autoit][/autoit] [autoit]
;Author: [email='AspirinJunkie@german-nlite.de'][/email]
Func _ArrayListSort2Dim(ByRef $ArrayList, $DimIndex, $Descending = 0)
Local $minIndex[2], $SortValueIf Not IsObj($ArrayList) Then Return SetError(1, 1, 0)
[/autoit] [autoit][/autoit] [autoit]
If $ArrayList.count = 0 Then Return SetError(2, 2, 0)
$SortValue = $ArrayList.Item (0)
If UBound($SortValue) <= $DimIndex Then Return SetError(3, 3, 0)
If $ArrayList.count < 2 Then Return SetError(4, 4, 0)
For $i = 0 To $ArrayList.count - 1
$SortValue = $ArrayList.Item ($i)
$SortValue = $SortValue[$DimIndex]$minIndex[0] = $i
[/autoit] [autoit][/autoit] [autoit]
$minIndex[1] = $SortValueFor $e = $i + 1 To $ArrayList.count - 1
[/autoit] [autoit][/autoit] [autoit]
$SortValue = $ArrayList.Item ($e)
$SortValue = $SortValue[$DimIndex]If $SortValue < $minIndex[1] Then
[/autoit] [autoit][/autoit] [autoit]
$minIndex[0] = $e
$minIndex[1] = $SortValue
EndIf
NextIf Not ($minIndex[0] = $i) Then
[/autoit]
$ArrayList.Insert ($i, $ArrayList.Item ($minIndex[0]))
$ArrayList.Insert ($minIndex[0] + 1, $ArrayList.Item ($i + 1))
$ArrayList.RemoveAt ($minIndex[0] + 2)
$ArrayList.RemoveAt ($i + 1)
EndIf
Next
If $Descending Then $ArrayList.Reverse
Return 1
EndFunc
Um Skriptcode zu testen muss man diesen in der Region "Zeitaufwand der Methode bestimmen" beim kommentierten Abschnitt "--------Code------" eintragen.
Dem ganzen kann dann mit der Variable $Name noch ein passender Titel verpasst werden.
Will man mehrere Skripte testen und direkt vergleichen so muss man lediglich die Region "Zeitaufwand der Methode bestimmen" kopieren und dort das nächste Skript entsprechend eintragen.
Bisschen merkwürdige Bedienung - war aber bisher nur für meine Zwecke gedacht.
Ich denke damit kann man die Geschwindigkeiten recht objektiv, weil qualitativ bewertbar, vergleichen. -
Nutz doch der Einfachheit halber globale Variablen welche du in der Funktion ja benutzen kannst.
Bzw. lass die Daten wenn möglich erst durch die Funktion selbst auslesen. -
Die Frage war hier aber auch schon längst beantwortet.
Mit der GUIRunOnce bzw. RunOnceEx-Methode kann Programme starten lassen welche dann beim ersten regulären Windows-Start NACH der Windows-Installation aufgerufen werden.
Da kannst du eintragen was du willst - z.b. deine AutoRun.exe