[Speed] Autoit vs. C

  • Ich Höre immer das Autoit so viel langsamer ist als C.
    Also hab ich mal einen kleinen Test geschrieben.
    Autoit ist bei mir im durchschnit ca. 107x langsamer als C. :pinch:


    Codes


    Autoit speed

    [autoit]

    $mytest = 0
    While ($mytest < 1000000)
    $mytest += 1
    WEnd

    [/autoit]


    C speed


    test suite

    [autoit]

    $i = 0
    FileDelete("ergebnis.txt")

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

    While($i < 5)
    $time_c_i = TimerInit()
    RunWait("c.exe")
    $time_c = TimerDiff($time_c_i)
    ConsoleWrite("C:" & @TAB & $time_c & @CRLF)

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

    Sleep(0)

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

    $time_a_i = TimerInit()
    RunWait("autoit.exe")
    $time_a = TimerDiff($time_c_i)
    ConsoleWrite("Autoit:" & @TAB & $time_a & @CRLF)

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

    ConsoleWrite("Autoit ist " & Round(($time_a / $time_c)) & "x langsamer als C" & @CRLF)
    FileWrite("ergebnis.txt","Autoit:" & @TAB & $time_a & @CRLF & "C:" & @TAB & $time_c & @CRLF & "Autoit ist " & Round(($time_a / $time_c)) & "x langsamer als C" & @CRLF & @CRLF)
    $i += 1
    Sleep(0)
    WEnd

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

    ShellExecute("ergebnis.txt")

    [/autoit]


    Packet zum selber testen unten angehängt.

    3 Mal editiert, zuletzt von senden9 (12. August 2009 um 15:10)

    • Offizieller Beitrag

    Ich denke, dass der Faktor bei komplexerem Code noch um einiges höher liegt (minimal drei-, eher vierstellig). Aber für eine interpretierte Sprache ist AutoIt schon ordentlich schnell :-). Es können ja keine Optimierungen auf Compilerebene gemacht werden, ebenso fällt die Zeit zur Tokenisierung immer an.

    Außerdem steckt in vielen Codestücken vom Programmierer noch deutliches Beschleunigungspotential :D.

    Johannes

    • Offizieller Beitrag

    Klar ist C schneller, aber gerade die While-Schleife dafür zu verwenden...
    For...Next ist in dem Fall deutlich schneller:

    Spoiler anzeigen
    [autoit]


    $iTimer = TimerInit()
    $mytest = 0
    While ($mytest < 1000000)
    $mytest += 1
    WEnd
    ConsoleWrite('While...WEnd:' & TimerDiff($iTimer)&@CR)

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

    $iTimer = TimerInit()
    $mytest = 0
    Do
    $mytest += 1
    Until $mytest = 1000000
    ConsoleWrite('Do...Until:' & TimerDiff($iTimer)&@CR)

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

    $iTimer = TimerInit()
    $mytest = 0
    For $i = 0 To 1000000
    $mytest += 1
    Next
    ConsoleWrite('For...Next:' & TimerDiff($iTimer)&@CR)

    [/autoit]
  • Die Frage ist, was es bringt, ein Programm einige Millisekunden schneller laufen zu haben (na klar ist kompilierter C-Code schneller) und dafür wesentlich länger für Programmerstellung und Debugging zu benötigen.
    Daher finde ich die .Net-Geschichte (habe mal in VB reingeschnuppert, hat was!) von MS so klasse, denn dort hat man das gute aus 2 Welten, schnelles GUI-Gebastel und schnellen Code.
    Ausserdem, wer Speedprobleme hat und trotzdem bei AutoIt bleiben möchte, der sollte mal im engl. Forum nach den Assembler-Includes gucken. Da sind teilweise schöne Sachen dabei.

  • Daher finde ich die .Net-Geschichte (habe mal in VB reingeschnuppert, hat was!) von MS so klasse, denn dort hat man das gute aus 2 Welten, schnelles GUI-Gebastel und schnellen Code.


    Tja, Sun hat es mit Java vorgemacht, MS zieht mit .NET was ähnliches auf ;) Beide kompilieren in eine Zwischenform, die dann über eine Runtime ausgeführt wird.

  • Hi,
    wie progandy schon geschrieben hat, werden bei den .NET-Sprachen die Befehle von einer Laufzeitumgebung zu einem Zwischencode abgearbeitet. Somit ist es (fast) völlig schnurz, welche der Sprachen verwendet wird, der wirklich vom Prozessor ausgeführte MaschinencCode istnahezu identisch und sowieso schnell genug. Die Priorität liegt bei diesen Sprachen auf der schnellen und unkomplizierten Programmentwicklung . SUN hatte da mit Java schon vor 10 Jahren das richtige Näschen^^
    Ich vermute mal, in der nächsten Entwicklungsstufe wird man noch unabhängiger von der eigentlichen Programmiersprache werden. Selbst jetzt ist es problemlos möglich in einem Projekt mehrere Programmiersprachen zu verwenden.
    Die Klassenbiblotheken sind von jeder Sprache zu benutzen, im Endeffekt wird es darauf hinauslaufen, daß es einen riesigen Pool von ALLEM gibt, was ein Rechner machen kann.Programmieren wird dann eher ein "Zusammenstellen" von Anforderungen sein, den Rest erledigt dann der Interpreter im Hintergrund...
    Die Zeiten des Codehackens sind jedenfalls gezählt...

  • Ich hab eben mal einen anderen Benchmark für AutoIT, C und C# gemacht. Es ist eine Funktion um eine Faltung auf ein Bild auzuführen.

    AutoIT-Code

    Spoiler anzeigen
    [autoit]

    Const $MAX_GRAY = 255

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

    Dim $inImage[480000]
    Dim $outImage[480000]
    Dim $filterMask[9]

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

    Dim $frequency = DllStructCreate("int64")
    Dim $begin = DllStructCreate("int64")
    Dim $end = DllStructCreate("int64")

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

    Dim $dll = DllOpen("kernel32.dll")

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

    DllCall($dll, "none", "QueryPerformanceFrequency", "ptr", DllStructGetPtr($frequency, 1))

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

    MsgBox(0,"", "Start!")

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

    DllCall($dll, "none", "QueryPerformanceCounter", "ptr", DllStructGetPtr($begin, 1))
    faltung_8bit_grey($inImage, $outImage, 800, 800, 600, $filterMask, 3)
    DllCall($dll, "none", "QueryPerformanceCounter", "ptr", DllStructGetPtr($end, 1))

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

    DllClose($dll)
    MsgBox(0,"", ((DllStructGetData($end, 1) - DllStructGetData($begin, 1)) / DllStructGetData($frequency, 1)) & " Sekunden")

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

    Func faltung_8bit_grey(ByRef $inBuffer, ByRef $outBuffer, $width, $alignedWidth, $height, ByRef $mask, $size)
    Dim $i
    Dim $tmp
    Dim $halfsize = $size / 2
    Dim $pixel
    Dim $middlePixel
    Dim $maskpos
    Dim $relX
    Dim $relY
    Dim $relYab
    Dim $filterSumme
    Dim $lastPixel = ($alignedWidth * ($height - 1)) + $width - 1
    Dim $x
    Dim $y

    ;Filtersumme
    For $i = 0 to ($size * $size) - 1
    $filterSumme += $mask[$i]
    Next

    if ($filterSumme = 0) Then
    $filterSumme = 0
    EndIf

    $tmp = $alignedWidth * $halfsize
    For $y = $halfsize to ($height - $halfsize) - 1
    For $x = $halfsize to ($width - $halfsize) - 1

    $pixel = 0
    $middlePixel = $x + $tmp
    $maskpos = 0

    For $relY = -$halfsize to $halfsize - 1

    $relYab = $alignedWidth * $relY

    For $relX = -$halfsize to $halfsize - 1
    $pixel += $inBuffer[$middlePixel + $relX + $relYab] * $mask[$maskpos]
    Next
    Next
    $pixel /= $filterSumme

    If ($pixel < 0) Then
    $outBuffer[$middlePixel] = 0
    ElseIf($pixel > $MAX_GRAY) Then
    $outBuffer[$middlePixel] = $MAX_GRAY
    Else
    $outBuffer[$middlePixel] = $pixel
    EndIf
    Next
    $tmp += $alignedWidth;
    Next
    EndFunc

    [/autoit]


    C-Code

    Spoiler anzeigen


    C#-Code

    Spoiler anzeigen

    C 0,0268 Sekunden ~ 482 fach
    C# 0,0280 Sekunden ~ 462 fach
    Java 0,0301 Sekunden ~ 430 fach
    AutoIT 12,9285 Sekunden

    Visual Basic sollte im selben bereich wie C# liegen.
    Vielleicht mach ich noch Java und VB, aber nich jetzt.
    n8

    2 Mal editiert, zuletzt von RAPTOR-ONE (2. November 2009 um 21:25)