AutoIt Versions-Archiv und Diskussionsthread (3.3.8.1 bis 3.3.10.2, Stand 30.12.13)

  • Ich war so frei und habe deine AutoIt-only 3D Engine genommen und ein Benchmark Mode hinzugefügt.

    Es werden 3000 Frames gerendert.

    Spoiler anzeigen
    [autoit]


    #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseUpx=n

    [/autoit] [autoit][/autoit] [autoit]

    #include <Date.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    HotKeySet("{ESC}", "quit")

    [/autoit] [autoit][/autoit] [autoit]

    StartUp(800, 600, False, 0, 0, 0, 0, 0, 0, 900, 999, 0.5, 1)

    [/autoit] [autoit][/autoit] [autoit]

    $sModel = "Cylinder.3DA"
    LoadModel()

    [/autoit] [autoit][/autoit] [autoit]

    CalculateShadingFactors()
    AdlibRegister("FPS", 1000)

    [/autoit] [autoit][/autoit] [autoit]

    $bBenchmark = True
    $ZoomAnimator = 0.1
    #forcedef $hGraphics, $Width, $Height, $RotX, $RotY, $RotZ, $TransX, $TransY, $TransZ, $Zm, $iFPS, $VerNum, $LineNum
    $iFramesRendered = 0
    $iMaxFrames = 2999
    $iTimer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $hBuffer = $hGraphics
    $hGraphics = GUICtrlCreateGraphic(0, 0, $Width, $Height)
    $RotX += 1
    $RotY += 1
    $RotZ += 1
    $Zm += $ZoomAnimator
    If $RotX > 360 Then $RotX = -355
    If $RotY > 360 Then $RotY = -355
    If $RotZ > 360 Then $RotZ = -355
    If $Zm > 960 Or $Zm < 900 Then $ZoomAnimator *= -1
    CreateVertexArray() ; Create a safe-to-edit copy of all vertices
    Translate($TransX, $TransY, $TransZ) ; Change the postion of all vertices
    Rotate($RotX, $RotY, $RotZ) ; Rotate all vertices
    Zoom($Zm) ; Zoom!
    ApplyPerpective() ; Well...
    BackfaceCulling() ; Leave behind what is behind!
    DrawToBuffer() ; Display it
    $iFPS += 1
    GUICtrlDelete($hBuffer)
    $iFramesRendered += 1
    If $iFramesRendered > $iMaxFrames And $bBenchmark Then
    $sResult = Round($iFramesRendered / (TimerDiff($iTimer) / 1000), 2) & " fps in ø. Rendered frames: " & $iFramesRendered & ". Render time: " & Round((TimerDiff($iTimer) / 1000), 2) & " seconds"
    $sAU3Arch = "X86"
    $bAU3Arch = @AutoItX64
    $aMemStats = MemGetStats()
    If $bAU3Arch Then $sAU3Arch = "X64"
    $tChkAero = DllStructCreate("int;")
    DllCall("dwmapi.dll", "int", "DwmIsCompositionEnabled", "struct*", $tChkAero)
    $bAero = DllStructGetData($tChkAero, 1)
    $sFile = @ScriptDir & "\Benchmark_Results.txt"
    $hFile = FileOpen($sFile, 1)
    FileWrite($hFile, "Date:" & @TAB & @TAB & @TAB & _Now() & @CRLF & _
    "AutoIt Version:" & @TAB & @TAB & @AutoItVersion & @CRLF & _
    "AutoIt Exe Arch.:" & @TAB & $sAU3Arch & @CRLF & _
    "OS Version:" & @TAB & @TAB & @OSVersion & @CRLF & _
    "OS Arch.:" & @TAB & @TAB & @OSArch & @CRLF & _
    "Aero enabled:" & @TAB & @TAB & $bAero & @CRLF & _
    "CPU Model:" & @TAB & @TAB & WMI_GetCPUModel() & @CRLF & _
    "Video Model:" & @TAB & @TAB & WMI_GetVideoModel() & @CRLF & _
    "Physical Mem:" & @TAB & @TAB & Ceiling($aMemStats[1] / 1024^2) & " GB" & @CRLF & _
    "3D Model used:" & @TAB & @TAB & StringRegExpReplace($sModel, "\.\\(.*)", "$1") & " -> Contains: " & $VerNum + 1 & " vertices and " & $LineNum + 1 & " faces" & @CRLF & _
    "Result:" & @TAB & @TAB & @TAB & $sResult & @CRLF & @CRLF & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($hFile)
    ShellExecute($sFile)
    Exit
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func StartUp($wi = 800, $he = 600, $Fs = False, $x = 0, $y = 0, $z = 0, $rx = 0, $ry = 0, $rz = 0, $zoom = 900, $dis = 1000, $shade = 0.5, $borders = True)
    If $Fs Then
    Global $Width = @DesktopWidth, $Height = @DesktopHeight
    $Style = 0x80000000
    $ExStyle = 34078736
    Else
    Global $Width = $wi, $Height = $he
    $Style = -1
    $ExStyle = 34078728
    EndIf
    Global $hGUI = GUICreate("", $Width, $Height, -1, -1, $Style, $ExStyle)
    GUISetOnEvent(-3, "quit")
    Global $hGraphics = GUICtrlCreateGraphic(0, 0, $Width, $Height)
    GUISetBkColor(0x404040)
    GUISetState()
    Global $PIover180 = ((ATan(1) * 4) / 180), $Ver[5000][3], $TempV[5000][3], $TempZ[5000], $TempLin[5000], $Lin[5000][24], $Zcol[5000]
    Global $Zcent1, $Zcent2, $TempNum, $LineNum, $VerNum, $Xa, $Ya, $Za, $iFPS, $Sa = $shade, $TransX = $x, $TransY = $y, $TransZ = $z, $RotX = $rx, $RotY = $ry, $RotZ = $rz, $Zm = $zoom, $ViewDis = $dis, $XOrigin = $Width / 2, $YOrigin = $Height / 2, $bLines = $borders
    EndFunc ;==>StartUp

    [/autoit] [autoit][/autoit] [autoit]

    Func DrawToBuffer()
    For $a = 0 To $TempNum
    $Zmin = $TempV[$Lin[$TempLin[$a]][1]][2]
    $Zmax = $TempV[$Lin[$TempLin[$a]][1]][2]
    For $t = 1 To $Lin[$TempLin[$a]][0]
    If $Zmin > $TempV[$Lin[$TempLin[$a]][$t]][2] Then $Zmin = $TempV[$Lin[$TempLin[$a]][$t]][2]
    If $Zmax < $TempV[$Lin[$TempLin[$a]][$t]][2] Then $Zmax = $TempV[$Lin[$TempLin[$a]][$t]][2]
    Next
    $z = $Zmax - $Zmin
    If $z > $Zcol[$a] Then $z = $Zcol[$a]
    $Col = ("0x" & Hex(Int($Lin[$TempLin[$a]][21] - ((($Lin[$TempLin[$a]][21] * $Sa) / $Zcol[$a]) * $z)), 2) & Hex(Int($Lin[$TempLin[$a]][22] - ((($Lin[$TempLin[$a]][22] * $Sa) / $Zcol[$a]) * $z)), 2) & Hex(Int($Lin[$TempLin[$a]][23] - ((($Lin[$TempLin[$a]][23] * $Sa) / $Zcol[$a]) * $z)), 2))
    If $bLines Then
    GUICtrlSetGraphic($hGraphics, 8, 0x000040, $Col)
    Else
    GUICtrlSetGraphic($hGraphics, 8, $Col, $Col)
    EndIf
    For $t = 1 To $Lin[$TempLin[$a]][0]
    If $t = 1 Then
    GUICtrlSetGraphic($hGraphics, 6, $TempV[$Lin[$TempLin[$a]][$t]][0], $TempV[$Lin[$TempLin[$a]][$t]][1])
    Else
    GUICtrlSetGraphic($hGraphics, 2, $TempV[$Lin[$TempLin[$a]][$t]][0], $TempV[$Lin[$TempLin[$a]][$t]][1])
    EndIf
    Next
    Next
    EndFunc ;==>DrawToBuffer

    [/autoit] [autoit][/autoit] [autoit]

    Func BackfaceCulling()
    If $LineNum = 0 Then Return 0
    $TempNum = -1
    For $a = 0 To $LineNum
    $Xmin1 = $TempV[$Lin[$a][1]][0]
    $Xmax1 = $Xmin1
    $Ymin1 = $TempV[$Lin[$a][1]][1]
    $Ymax1 = $Ymin1
    $Zmin1 = $TempV[$Lin[$a][1]][2]
    $Zmax1 = $Zmin1
    For $b = 1 To $Lin[$a][0]
    If $Xmin1 > $TempV[$Lin[$a][$b]][0] Then $Xmin1 = $TempV[$Lin[$a][$b]][0]
    If $Xmax1 < $TempV[$Lin[$a][$b]][0] Then $Xmax1 = $TempV[$Lin[$a][$b]][0]
    If $Ymin1 > $TempV[$Lin[$a][$b]][1] Then $Ymin1 = $TempV[$Lin[$a][$b]][1]
    If $Ymax1 < $TempV[$Lin[$a][$b]][1] Then $Ymax1 = $TempV[$Lin[$a][$b]][1]
    If $Zmin1 > $TempV[$Lin[$a][$b]][2] Then $Zmin1 = $TempV[$Lin[$a][$b]][2]
    If $Zmax1 < $TempV[$Lin[$a][$b]][2] Then $Zmax1 = $TempV[$Lin[$a][$b]][2]
    Next
    Local $b = 0, $DotProduct = ($TempV[$Lin[$a][3]][0] * (($TempV[$Lin[$a][1]][2] * $TempV[$Lin[$a][2]][1]) - ($TempV[$Lin[$a][1]][1] * $TempV[$Lin[$a][2]][2]))) + ($TempV[$Lin[$a][3]][1] * (($TempV[$Lin[$a][1]][0] * $TempV[$Lin[$a][2]][2]) - ($TempV[$Lin[$a][1]][2] * $TempV[$Lin[$a][2]][0]))) + ($TempV[$Lin[$a][3]][2] * (($TempV[$Lin[$a][1]][1] * $TempV[$Lin[$a][2]][0]) - ($TempV[$Lin[$a][1]][0] * $TempV[$Lin[$a][2]][1])))
    If $Xmin1 < 0 And $Xmax1 < 0 Then $b += 1
    If $Xmin1 > $Width And $Xmax1 > $Width Then $b += 1
    If $Ymin1 < 0 And $Ymax1 < 0 Then $b += 1
    If $Ymin1 > $Height And $Ymax1 > $Height Then $b += 1
    If $Zmin1 > $ViewDis Then $b += 1
    If $b <> 0 Then ContinueLoop
    If $DotProduct > 0 Then
    $TempNum = $TempNum + 1
    $TempLin[$TempNum] = $a
    $TempZ[$a] = ($Zmax1 - $Zmin1) / 2 + $Zmin1
    EndIf
    Next
    If $TempNum = 0 Then Return 0
    Do
    $Sw = False
    For $a = 0 To $TempNum - 1
    If $TempZ[$TempLin[$a]] <= $TempZ[$TempLin[$a + 1]] Then ContinueLoop
    $Dummy = $TempLin[$a]
    $TempLin[$a] = $TempLin[$a + 1]
    $TempLin[$a + 1] = $Dummy
    $Sw = True
    Next
    Until $Sw = False
    EndFunc ;==>BackfaceCulling

    [/autoit] [autoit][/autoit] [autoit]

    Func ApplyPerpective()
    For $a = 0 To $VerNum
    $Xx = $TempV[$a][0]
    $Yy = $TempV[$a][1]
    $z = $TempV[$a][2]
    If $z < -999 Then $z = -999
    If $z > 999 Then $z = 999
    $TempV[$a][0] = $XOrigin + ($Xx / (1000 - $z)) * 1000
    $TempV[$a][1] = $YOrigin + ($Yy / (1000 - $z)) * 1000
    Next
    EndFunc ;==>ApplyPerpective

    [/autoit] [autoit][/autoit] [autoit]

    Func Zoom($z)
    For $a = 0 To $VerNum
    $TempV[$a][2] += $z
    Next
    EndFunc ;==>Zoom

    [/autoit] [autoit][/autoit] [autoit]

    Func Rotate($Xx, $Yy, $z)
    Local $Xn = $Xx * $PIover180, $Yn = $Yy * $PIover180, $Zn = $z * $PIover180
    For $a = 0 To $VerNum
    $Xx = $TempV[$a][0]
    $Yy = $TempV[$a][1]
    $z = $TempV[$a][2]
    Local $X1 = $Xx * Cos($Zn) - $Yy * Sin($Zn), $Y1 = $Yy * Cos($Zn) + $Xx * Sin($Zn), $Z1 = $z
    $TempV[$a][0] = $X1
    $TempV[$a][1] = $Y1
    $TempV[$a][2] = $Z1
    $Xx = $TempV[$a][0]
    $Yy = $TempV[$a][1]
    $z = $TempV[$a][2]
    Local $Z1 = $z * Cos($Yn) - $Xx * Sin($Yn), $X1 = $z * Sin($Yn) + $Xx * Cos($Yn), $Y1 = $Yy
    $TempV[$a][0] = $X1
    $TempV[$a][1] = $Y1
    $TempV[$a][2] = $Z1
    $Xx = $TempV[$a][0]
    $Yy = $TempV[$a][1]
    $z = $TempV[$a][2]
    Local $Y1 = $Yy * Cos($Xn) - $z * Sin($Xn), $Z1 = $Yy * Sin($Xn) + $z * Cos($Xn), $X1 = $Xx
    $TempV[$a][0] = $X1
    $TempV[$a][1] = $Y1
    $TempV[$a][2] = $Z1
    Next
    EndFunc ;==>Rotate

    [/autoit] [autoit][/autoit] [autoit]

    Func Translate($x, $y, $z)
    For $a = 0 To $VerNum
    $TempV[$a][0] += $x
    $TempV[$a][1] += $y
    $TempV[$a][2] += $z
    Next
    EndFunc ;==>Translate

    [/autoit] [autoit][/autoit] [autoit]

    Func Sca($S)
    For $a = 0 To $VerNum
    For $b = 0 To 2
    $TempV[$a][$b] *= $S
    Next
    Next
    EndFunc ;==>Sca

    [/autoit] [autoit][/autoit] [autoit]

    Func CreateVertexArray()
    For $a = 0 To $VerNum
    For $b = 0 To 2
    $TempV[$a][$b] = $Ver[$a][$b]
    Next
    Next
    EndFunc ;==>CreateVertexArray

    [/autoit] [autoit][/autoit] [autoit]

    Func CalculateShadingFactors()
    For $a = 0 To $LineNum
    $Xmin1 = $Ver[$Lin[$a][1]][0]
    $Xmax1 = $Xmin1
    $Ymin1 = $Ver[$Lin[$a][1]][1]
    $Ymax1 = $Ymin1
    $Zmin1 = $Ver[$Lin[$a][1]][2]
    $Zmax1 = $Zmin1
    For $b = 1 To $Lin[$a][0]
    $Xmin2 = $Ver[$Lin[$a][$b]][0]
    $Ymin2 = $Ver[$Lin[$a][$b]][1]
    $Zmin2 = $Ver[$Lin[$a][$b]][2]
    If $Xmin1 > $Xmin2 Then $Xmin1 = $Xmin2
    If $Xmax1 < $Xmin2 Then $Xmax1 = $Xmin2
    If $Ymin1 > $Ymin2 Then $Ymin1 = $Ymin2
    If $Ymax1 < $Ymin2 Then $Ymax1 = $Ymin2
    If $Zmin1 > $Zmin2 Then $Zmin1 = $Zmin2
    If $Zmax1 < $Zmin2 Then $Zmax1 = $Zmin2
    Next
    $X1 = Abs($Xmax1 - $Xmin1)
    $Y1 = Abs($Ymax1 - $Ymin1)
    $Z1 = Abs($Zmax1 - $Zmin1)
    If $X1 >= $Y1 And $X1 >= $Z1 Then $Zcol[$a] = $X1
    If $Y1 >= $X1 And $Y1 >= $Z1 Then $Zcol[$a] = $Y1
    If $Z1 >= $X1 And $Z1 >= $Y1 Then $Zcol[$a] = $Z1
    Next
    EndFunc ;==>CalculateShadingFactors

    [/autoit] [autoit][/autoit] [autoit]

    Func LoadModel()
    Local $aLines[41] = [ "Cylinder.3DA", _
    "23", _
    "v -2.5 -4.33012701892219 -10", _
    "v 0 -5 -10", _
    "v 2.5 -4.33012701892219 -10", _
    "v 4.33012701892219 -2.5 -10", _
    "v 5 -3.06151588455594e-016 -10", _
    "v 4.33012701892219 2.5 -10", _
    "v 2.5 4.33012701892219 -10", _
    "v 6.12303176911189e-016 5 -10", _
    "v -2.5 4.33012701892219 -10", _
    "v -4.33012701892219 2.5 -10", _
    "v -5 9.18454765366783e-016 -10", _
    "v -4.33012701892219 -2.5 -10", _
    "v -2.5 -4.33012701892219 10", _
    "v 0 -5 10", _
    "v 2.5 -4.33012701892219 10", _
    "v 4.33012701892219 -2.5 10", _
    "v 5 -3.06151588455594e-016 10", _
    "v 4.33012701892219 2.5 10", _
    "v 2.5 4.33012701892219 10", _
    "v 6.12303176911189e-016 5 10", _
    "v -2.5 4.33012701892219 10", _
    "v -4.33012701892219 2.5 10", _
    "v -5 9.18454765366783e-016 10", _
    "v -4.33012701892219 -2.5 10", _
    "13", _
    "f 4 1 0 12 13 0 100 200", _
    "f 4 2 1 13 14 0 100 200", _
    "f 4 3 2 14 15 0 100 200", _
    "f 4 4 3 15 16 0 100 200", _
    "f 4 5 4 16 17 0 100 200", _
    "f 4 6 5 17 18 0 100 200", _
    "f 4 7 6 18 19 0 100 200", _
    "f 4 8 7 19 20 0 100 200", _
    "f 4 9 8 20 21 0 100 200", _
    "f 4 10 9 21 22 0 100 200", _
    "f 4 11 10 22 23 0 100 200", _
    "f 4 0 11 23 12 0 100 200", _
    "f 12 0 1 2 3 4 5 6 7 8 9 10 11 0 100 200", _
    "f 12 23 22 21 20 19 18 17 16 15 14 13 12 0 100 200"]
    $Lines = UBound($aLines)
    $VerNum = $aLines[1]
    For $i = 2 To $VerNum + 2
    $sRead = $aLines[$i]
    $aTemp = StringSplit(StringTrimLeft($sRead, 2), " ", 3)
    For $n = 0 To 2
    $Ver[$i - 2][$n] = $aTemp[$n]
    Next
    Next
    $LineN = $VerNum + 3
    $LineNum = $aLines[$LineN]
    For $i = $VerNum + 4 To $VerNum + 4 + $LineNum
    $sRead = $aLines[$i]
    $PCount = StringMid($sRead, 3, 1)
    If StringMid($sRead, 4, 1) <> " " Then $PCount = StringMid($sRead, 3, 2)
    $Cut = 4
    If StringMid($sRead, 4, 1) <> " " Then $Cut = 5
    $aTemp = StringSplit(StringTrimLeft($sRead, $Cut), " ", 3)
    $Lin[$i - ($VerNum + 4)][0] = $PCount
    For $n = 1 To $PCount
    $Lin[$i - ($VerNum + 4)][$n] = $aTemp[$n - 1]
    Next
    For $n = 21 To 23
    If Number($aTemp[$PCount + ($n - 21)]) <> 0 Then $Lin[$i - ($VerNum + 4)][$n] = Number($aTemp[$PCount + ($n - 21)])
    Next
    Next
    EndFunc ;==>LoadModel

    [/autoit] [autoit][/autoit] [autoit]

    Func FPS()
    WinSetTitle("", "", "minx' AutoIt-only 3D Engine | Flat Shading Mode | FPS: " & $iFPS & " (ø fps " & StringFormat("%.2f", $iFramesRendered / (TimerDiff($iTimer) / 1000)) & ", # frames: " & $iFramesRendered & ")")
    $iFPS = 0
    EndFunc ;==>FPS

    [/autoit] [autoit][/autoit] [autoit]

    Func quit()
    Exit
    EndFunc ;==>quit

    [/autoit] [autoit][/autoit] [autoit]

    Func WMI_GetCPUModel($sHost = @ComputerName)
    Local $objItem
    Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2")
    Local $oColItems = $objWMIService.ExecQuery("SELECT Name FROM Win32_Processor", "WQL", 0x30)
    If IsObj($oColItems) Then
    For $objItem In $oColItems
    Return StringStripWS($objItem.Name, 7)
    Next
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func WMI_GetVideoModel($sHost = @ComputerName)
    Local $objItem
    Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2")
    Local $oColItems = $objWMIService.ExecQuery("SELECT AdapterRAM, CurrentRefreshRate, Description, VideoProcessor FROM Win32_VideoController", "WQL", 0x30)
    If IsObj($oColItems) Then
    For $objItem In $oColItems
    Return $objItem.Description & ", " & $objItem.VideoProcessor & ", " & StringFormat("%.2f", ("0x" & Hex($objItem.AdapterRAM)) / 1024^2) & " MB RAM, @" & $objItem.CurrentRefreshRate & " Hz"
    Next
    EndIf
    EndFunc

    [/autoit]

    Das Resultat wird in der Datei @ScriptDir & "\Benchmark_Results.txt" gespeichert.

    Wenn es bereits eine modifizierte Version gibt, dann gibt es jetzt eine weitere. ;)

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    2 Mal editiert, zuletzt von UEZ (30. Juli 2013 um 15:18)

  • Ich hab grad etwas entdeckt, das die schlechtere Performance der Beta erklären könnte:

    Die For-Schleife ist in der Beta viel langsamer! Manchmal sogar mehr als 150%! (Beta 3.3.9.13)

    Wenn man in einem Benchmark-Script die For durch eine While-Schleife ersetzt, dann schrumpft der Geschwindigkeitsunterschied enorm.
    Misst man ohne Schleife (einfach die zu messenden Befehle x-mal kopieren), dann ist die Beta kaum merkbar langsamer als die Stable.

    Ausreichende Tests hab ich noch nicht gemacht, aber ich denke mal, da liegt der Hund begraben...

    E

  • Good catch eukalyptus!


    Ich habe den Benchmark oben in do/until umgewandelt und es sieht so aus, als ob dann die Beta auch "gleich" schnell läuft.

    [autoit]


    $j = 0
    $iMax = 50000000
    $t = TimerInit()
    For $i = 0 To $iMax
    $j += 1
    Next
    $fEnd = TimerDiff($t) / 1000
    ConsoleWrite(StringFormat("%.2f seconds.", $fEnd) & @LF)

    [/autoit]

    3.3.8.1: 10.85 seconds.
    3.3.9.13: 13.17 seconds.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hm.

    Trotzdem ist das kein Pluspunkt oder eine adäquate Lösung. Die Standard-Befehle sollten nicht grundlos an Performance einbüßen. "Zurechtbiegen" kann man sich es immer ;)

  • Eine Lösung ist es eh nicht.
    Auch die Beta-For Schleife ist noch immer schneller, als die Stable-While.

    Falls es nur die For-Schleife wäre, dann sollte Jon das leicht beschleunigen können...
    Leider ist zumindest auch der Arrayzugriff langsamer geworden!

    Ich bin grad dabei ein Benchmarkscript zu schreiben, welches die Loop-Zeit herausrechnet.
    Um zu sehen, welche Befehle nun tatsächlich langsamer geworden sind.

    DllStruct write und read sind gleich geblieben.
    Array write hingegen ist in der Beta langsamer...

    Weiter bin ich z.Z. noch nicht.

    E

  • Benchmark Stable vs Beta (Alpha) :D

    Im Anhang befindet sich mein Benchmark-Test Script.
    Hab leider keine Zeit mehr um weiterzumachen...

    Hier meine Ergebnisse:

    Code
    ! For       : 157.92%   (5.49ms : 8.67ms)
    ! While     : 98.49%   (90.35ms : 88.99ms)
    ! Array     : 128.16%   (441.40ms : 565.68ms)
    ! Struct    : 105.99%   (1000.87ms : 1060.83ms)
    ! Add       : 114.95%   (21.71ms : 24.95ms)
    ! Sqrt      : 101.29%   (72.50ms : 73.43ms)

    E

  • Hi eukalyptus,

    warum hast du in der _BM_Struct() Funktion noch eine For/Next Schleife vor der Struct Schleife eingebaut?

    Ich habe noch Do/Until, If/Then/Else und Switch/Case hinzugefügt:
    Benchmark.au3

    Spoiler anzeigen
    [autoit]


    If $CmdLine[0] <> 1 Or $CmdLine[1] <> "1" Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    Global $sPath_Ini = @ScriptDir & "\Benchmark.ini"

    [/autoit] [autoit][/autoit] [autoit]

    Global $iLoop = Number(IniRead($sPath_Ini, "Loop", "Cnt", "0"))

    [/autoit] [autoit][/autoit] [autoit]

    _BM_IfThenElse($iLoop)
    _BM_SwitchCase($iLoop)
    _BM_For($iLoop)
    _BM_While($iLoop)
    _BM_Do($iLoop)
    _BM_Array($iLoop)
    _BM_Struct($iLoop)
    _BM_Add($iLoop)
    _BM_Sqrt($iLoop)

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_SwitchCase($iLoop)
    Local $iTimer, $fTime, $iI, $a = 10, $b = 20, $r
    $iI = 1
    $iTimer = TimerInit()
    Do
    Switch $a * $b
    Case 1 To 10
    $r = True
    Case 11 to 100
    $r = False
    Case Else
    $r = -1
    EndSwitch
    $iI += 1
    Until $iI > $iLoop
    $fTime = TimerDiff($iTimer)
    IniWrite($sPath_Ini, "SwitchCase", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_SwitchCase

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_IfThenElse($iLoop)
    Local $iTimer, $fTime, $iI, $a = 1, $b = 2, $c = -3, $r
    $iI = 1
    $iTimer = TimerInit()
    Do
    If $a > $b Then
    $r = True
    ElseIf $a > $c Then
    $r = False
    Else
    $r = -1
    EndIf
    $iI += 1
    Until $iI > $iLoop
    $fTime = TimerDiff($iTimer)
    IniWrite($sPath_Ini, "IfThenElse", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_IfThenElse

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_For($iLoop)
    Local $iTimer, $fTime
    $iTimer = TimerInit()
    For $i = 1 To $iLoop
    Next
    $fTime = TimerDiff($iTimer)
    IniWrite($sPath_Ini, "For", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_For

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_While($iLoop)
    Local $iTimer, $fTime, $iI
    $iI = 1
    $iTimer = TimerInit()
    While $iI <= $iLoop
    $iI += 1
    WEnd
    $fTime = TimerDiff($iTimer)
    IniWrite($sPath_Ini, "While", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_While

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_Do($iLoop)
    Local $iTimer, $fTime, $iI
    $iI = 1
    $iTimer = TimerInit()
    Do
    $iI += 1
    Until $iI > $iLoop
    $fTime = TimerDiff($iTimer)
    IniWrite($sPath_Ini, "Do", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_Do

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_Struct($iLoop)
    Local $iTimer, $fTime, $fTime_Loop
    Local $tStruct = DllStructCreate("float[" & $iLoop & "]; float[" & $iLoop & "];")
    Local $fVal = 12345.6789
    $iTimer = TimerInit()
    For $i = 1 To $iLoop
    DllStructSetData($tStruct, 1, 123.45, $i)
    DllStructSetData($tStruct, 2, $fVal, $i)
    $fVal = DllStructGetData($tStruct, 1, $i)
    $fVal = DllStructGetData($tStruct, 2, $i)
    Next
    $fTime = TimerDiff($iTimer)
    IniWrite($sPath_Ini, "Struct", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_Struct

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_Array($iCnt)
    Local $iTimer, $fTime, $fTime_Loop
    Local $aArray[$iCnt + 1][2]
    Local $iVal = 123456
    $iTimer = TimerInit()
    For $i = 1 To $iCnt
    Next
    $fTime_Loop = TimerDiff($iTimer)
    $iTimer = TimerInit()
    For $i = 1 To $iCnt
    $aArray[$i][0] = 1234
    $aArray[$i][1] = $iVal
    $iVal = $aArray[$i][0]
    $iVal = $aArray[$i][1]
    Next
    $fTime = TimerDiff($iTimer) - $fTime_Loop
    IniWrite($sPath_Ini, "Array", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_Array

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_Add($iCnt)
    Local $iTimer, $fTime, $fTime_Loop
    Local $iVal = 1
    $iTimer = TimerInit()
    For $i = 1 To $iCnt
    Next
    $fTime_Loop = TimerDiff($iTimer)
    $iTimer = TimerInit()
    For $i = 1 To $iCnt
    $iVal += 1
    Next
    $fTime = TimerDiff($iTimer) - $fTime_Loop
    IniWrite($sPath_Ini, "Add", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_Add

    [/autoit] [autoit][/autoit] [autoit]

    Func _BM_Sqrt($iCnt)
    Local $iTimer, $fTime, $fTime_Loop
    Local $iVal = 1
    $iTimer = TimerInit()
    For $i = 1 To $iCnt
    Next
    $fTime_Loop = TimerDiff($iTimer)
    $iTimer = TimerInit()
    For $i = 1 To $iCnt
    $iVal = Sqrt($i)
    Next
    $fTime = TimerDiff($iTimer) - $fTime_Loop
    IniWrite($sPath_Ini, "Sqrt", @AutoItVersion, $fTime)
    EndFunc ;==>_BM_Sqrt

    [/autoit]

    Stable_vs_Beta.au3

    Spoiler anzeigen
    [autoit]


    Global $sRegKey = "HKEY_LOCAL_MACHINE64\SOFTWARE\"
    If @OSArch <> "X86" Then $sRegKey &= "Wow6432Node\"
    Global $sPath_Stable = RegRead($sRegKey & "AutoIt v3\AutoIt", "InstallDir")
    Global $sVersion_Stable = StringTrimLeft(RegRead($sRegKey & "AutoIt v3\AutoIt", "Version"), 1)
    Global $sPath_Beta = RegRead($sRegKey & "AutoIt v3\AutoIt", "betaInstallDir")
    Global $sVersion_Beta = StringTrimLeft(RegRead($sRegKey & "AutoIt v3\AutoIt", "betaVersion"), 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $sPath_Ini = @ScriptDir & "\Benchmark.ini"
    If FileExists($sPath_Ini) Then FileDelete($sPath_Ini)

    [/autoit] [autoit][/autoit] [autoit]

    IniWrite($sPath_Ini, "Version", "Stable", $sVersion_Stable)
    IniWrite($sPath_Ini, "Version", "Beta", $sVersion_Beta)

    [/autoit] [autoit][/autoit] [autoit]

    IniWrite($sPath_Ini, "Loop", "Cnt", 300000)

    [/autoit] [autoit][/autoit] [autoit]

    RunWait($sPath_Stable & '\AutoIt3.exe "' & @ScriptDir & '\Benchmark.au3" "1"')
    RunWait($sPath_Beta & '\AutoIt3.exe "' & @ScriptDir & '\Benchmark.au3" "1"')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _Compare("IfThenElse")
    _Compare("SwitchCase")
    _Compare("For")
    _Compare("While")
    _Compare("Do")
    _Compare("Array")
    _Compare("Struct")
    _Compare("Add")
    _Compare("Sqrt")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Compare($sBM = "Array")
    Local $fTime_Stable = IniRead($sPath_Ini, $sBM, $sVersion_Stable, "0")
    Local $fTime_Beta = IniRead($sPath_Ini, $sBM, $sVersion_Beta, "0")
    ConsoleWrite("! " & StringFormat("%-10s: %.2f%% (%.2fms : %.2fms)\n", $sBM, $fTime_Beta * 100 / $fTime_Stable, $fTime_Stable, $fTime_Beta))
    EndFunc ;==>_Compare

    [/autoit]


    Meine Ergebnisse:

    3.3.8.1

    Code
    ! IfThenElse: 103.34%   (611.97ms : 632.43ms)
    ! SwitchCase: 106.36%   (651.39ms : 692.79ms)
    ! For       : 170.99%   (14.12ms : 24.15ms)
    ! While     : 107.04%   (184.22ms : 197.20ms)
    ! Do        : 111.15%   (185.96ms : 206.68ms)
    ! Array     : 124.89%   (933.42ms : 1165.77ms)
    ! Struct    : 107.02%   (2071.65ms : 2217.10ms)
    ! Add       : 115.99%   (53.15ms : 61.65ms)
    ! Sqrt      : 111.28%   (171.91ms : 191.29ms)

    3.3.9.13:

    Code
    ! IfThenElse: 100.18%   (621.49ms : 622.60ms)
    ! SwitchCase: 107.36%   (644.95ms : 692.42ms)
    ! For       : 180.21%   (13.54ms : 24.39ms)
    ! While     : 106.94%   (182.92ms : 195.62ms)
    ! Do        : 103.35%   (186.43ms : 192.67ms)
    ! Array     : 131.40%   (887.30ms : 1165.89ms)
    ! Struct    : 146.73%   (2065.47ms : 3030.73ms)
    ! Add       : 109.88%   (55.39ms : 60.86ms)
    ! Sqrt      : 175.79%   (175.75ms : 308.95ms)


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • warum hast du in der _BM_Struct() Funktion noch eine For/Next Schleife vor der Struct Schleife eingebaut

    Diese Schleife ist in jeder Funktion!
    Ich messe diese Zeit und ziehe diese dann von der Hauptzeit ab.
    Somit sind die Ergebnisse nicht dadurch verfälscht, dass schon die For-Schleife selber unterschiedliche Messergebnisse liefert!

    Anfangs wollte ich jeder Funktion unterschiedliche Loopzähler verpassen, deshalb ist diese For-Schleife in jeder Funktion vorhanden und nicht einmal global am Anfang.

    Wie wir mittlerweile sehen, sind die Do-Until Schleifen in den Versionen 3.3.8.1 und 3.3.9.13 fast gleich schnell
    Deshalb sollten wir auch in Benchmark.au3 alle For-Schleifen durch Do-Until ersetzen!

    Das konnte ich am Anfang leider noch nicht wissen ^^

  • Jop, deshalb sind auch alle Tests von mir ziemlich gravierend ausgefallen.
    Jeder benutzt die For-Schleife, da ich davon ausgegangen bin dass diese immer gleich schnell bleibt.
    Da sind "Abstürze" um 30-40% kein Wunder...

  • Bei einem erstem Test mit dem Skript von Mars erreicht die Stable bei 20 Durchgängen ca. 45.83 Punkte. Version 3.3.9.5 kommt im Vergleich auf 42.29 Punkte. Hat schon jemand irgendwelche genaueren Tests gemacht und kann bestätigen, dass AutoIt wieder ein ganz kleines bisschen schneller geworden ist?

  • Same shit as every Version....never change a running System!

    Fehlermeldung in einer EXE immer noch "Error 8462389562 in Line 0" und noch vieeel besser:
    error: _WinAPI_MoveMemory() already defined.
    Aber WO diese Funktion defined ist, behält der Interpreter für sich....
    Beides habe ich schon vor Jahren gemeldet, scheint so, als ob Featuritis höher wiegt als Bugfixing und die C&P-User bevorzugt bedient werden (müssen) :thumbdown:

    Meine persönliches "User-Include-Dir" ist jedenfalls größer als die gesamte restliche AutoIt-Installation.
    Ich denke bei einigen anderen Intensiv-Scriptern ist das zumindest ähnlich. Werden da gewrapperte API-Funktionen zu AutoIt-Interna, sollte es doch zumindest möglich sein, den Ort dieser Mehrfachdeklaration herausfinden zu können.
    Wäre vielleicht besser, die DEV´s würden sich mehr mit AutoIt und weniger mit C++ beschäftigen! In VC++ werden die Positionen mehrfachdeklarierter Funktionen nämlich angezeigt...

    Habe jetzt ca. 20 Scripte testweise durchgespielt, eins steht für mich fest. In der Firma werde ich einen Teufel tun und die aktuelle Stable aufspielen und mir damit sämtliche Scripte zerschiessen.
    Zuhause werde ich mir die (stabil laufende) 3.3.8.1 parallel installieren und damit arbeiten und ggf. mit der "aktuellen" Stable gegentesten (Alt-F5 ftl :S )

  • Also ich bin super zufrieden mit der neuen Version, einfach Top :thumbup:
    Ich muss gestehen, das ich aber auch schon seit Monaten immer mit der jeweiligen aktuellen Beta gearbeitet habe.

    error: _WinAPI_MoveMemory() already defined.
    Aber WO diese Funktion defined ist, behält der Interpreter für sich....
    .....
    Meine persönliches "User-Include-Dir" ist jedenfalls größer als die gesamte restliche AutoIt-Installation.

    Hehe, wo ich das gelesen habe, musste ich schon schmunzeln :rolleyes:

    Bzw. sollte man immer mit den folgenden AU3Check Parametern Programmieren, dann bleiben böse Überraschungen meistens aus ;)

    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7

    [/autoit]


    Und für Ordnungsfanatiker, bzw zwischen durch mal :thumbup:

    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 -v 3

    [/autoit]

    EDIT:

    AutoIt-Versionsarchiv (Mirror) und Diskussionsthread
    -> Wer Versionen 3.3.9.12 bis 3.3.9.23 hat, bitte melden!


    Hab die Versionen! Brauchst du sie noch? Dann würde ich sie dir Hochladen.

    Einmal editiert, zuletzt von Taz77 (23. Dezember 2013 um 23:43)

  • [autoit]

    _ScreenCapture_Capture($bitmap_datei)

    [/autoit]

    buggy, erstellt keine Datei, da Fehler in der Funktion

    [autoit]

    _GDIPlus_BitmapCloneArea

    [/autoit]

    in der GDIplus.au3
    Es muss dort die Funktion

    [autoit]

    Local $aResult = DllCall($ghGDIPDll, "int", "GdipCloneBitmapArea", "float", $nLeft, "float", $nTop, "float", $nWidth, "float", $nHeight, _
    "int", $iFormat, "handle", $hBmp, "handle*", 0)

    [/autoit]

    aufgerufen werden, also GdipCloneBitmapArea statt GdipCloneBitmapAreaI

    Zitat

    das ich aber auch schon seit Monaten immer mit der jeweiligen aktuellen Beta gearbeitet habe.

    Was nützt die Beta, wenn man ausschliesslich die STABLE (deshalb heisst die so! ) benutzt? "Alte" GDI-Funktionen in der Stable buggy ist nach der 823. Beta indiskutabel....

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (25. Dezember 2013 um 19:21)

  • Geschwindigkeit kann ich bestätigen. Habe zwar nur kurz getestet, aber es waren in jedem Fall zwischen 5% und 20% mehr Tempo. (im Schnitt habe ich (17±2)% raus)

    lg
    M

  • DANKE, Andy! :thumbup:

    Ich war seit Stunden am verzweifeln, weil mein Skript plötzlich nicht mehr funktioniert hat. Dann lese ich das - und es geht wieder!

    Super! :thumbup:

    MfG Xenon :)