Geschwindigkeit (AutoIt, Blitz3D(BlitzBasic), FreeBASIC, Java, Python, Lua, Ruby, ActionScript)

  • ich habe mal aus interesse das gleiche skript so gut wie möglich in mehreren programmiersprachen geschrieben um zu messen wie viel zeit diese dafür benötigen. in dem skript wird eine variable so lange um 10 erhöht bis diese variable 100000000 erreicht. dieser vorgang wird viermal ausgeführt damit man einen durchschnittswert erhält. ich hoffe das die skripte auch stimmen und die zeitwerte auch.

    AutoIt
    [autoit]

    $diff = 0
    for $a = 0 to 3
    $i = 0
    $timer = TimerInit()
    while $i <> 100000000
    $i += 10
    WEnd
    ConsoleWrite(TimerDiff($timer)&@CRLF)
    $diff += TimerDiff($timer)
    Next
    ConsoleWrite($diff/4&@CRLF)

    [/autoit]


    1. durchlauf: 10584.4285381053ms
    2. durchlauf: 10586.5284718916ms
    3. durchlauf: 10490.6476379452ms
    4. durchlauf: 10606.4572835072ms
    durchschnitt: 10567.0634941793ms

    Blitz3D


    1. durchlauf: 955ms
    2. durchlauf: 938ms
    3. durchlauf: 934ms
    4. durchlauf: 971ms
    durchschnitt: 952ms

    FreeBASIC


    1. durchlauf: 31ms
    2. durchlauf: 31ms
    3. durchlauf: 32ms
    4. durchlauf: 31ms
    durchschnitt: 31.25ms

    Java


    1. durchlauf: 31ms
    2. durchlauf: 15ms
    3. durchlauf: 16ms
    4. durchlauf: 16ms
    durchschnitt: 19ms

    Python


    1. durchlauf: 2797.00016975ms
    2. durchlauf: 2812.00003624ms
    3. durchlauf: 2796.99993134ms
    4. durchlauf: 2812.99996376ms
    durchschnitt: 2804.75002527ms

    Lua


    1. durchlauf: 2031.25ms
    2. durchlauf: 2046.875ms
    3. durchlauf: 2062.5ms
    4. durchlauf: 2062.5ms
    durchschnitt: 2050.78125ms

    Ruby


    1. durchlauf: 4437.5ms
    2. durchlauf: 4406.25ms
    3. durchlauf: 4453.125ms
    4. durchlauf: 4437.5ms
    durchschnitt: 4433.59375ms

    ActionScript


    komischerweise stürzt swish max immer ab wenn ich es starte aber ohne error meldung.

    was haltet ihr davon?
    welche skripte könnte man noch schneller machen?

  • Die Timerdiff Sachen sollten außerhalb der eigentlichen Schleifen gemacht werden oder?
    Sonst misst man diese Funktionen mit und ob deren Umsetzung vergleichbar ist?

    [autoit]


    $loops=10
    $timer = TimerInit()
    for $a = 1 to $loops
    $i = 0
    while $i <> 100000000
    $i += 10
    WEnd
    Next
    ConsoleWrite(TimerDiff($timer)/$loops&@CRLF)

    [/autoit]
  • Zum Vergleich: Mein PC kommt mit AutoIt auf 17388.64 ms.

    &quot;C++11&quot;

    Compiled mit gcc (allerdings ältere Version).

    1. Durchlauf: 33 ms
    2. Durchlauf: 33 ms
    3. Durchlauf: 32ms
    4. Durchlauf: 32 ms
    Durchschnitt: 32.5 ms

    Compiler-option -O3 gesetzt (beste Optimierungsstufe).
    Alles 0 ms
    Durch den Compileroptimierer wird die gesamte innere Schleife entfernt, da sie unnötige Berechnungen enthält und außerdem die äußere Schleife "entfaltet", sodass die 4 identischen Befehle hintereinander abgespielt werden. Dadurch werden auf unnötige jump-Befehle verzichtet.
    Als weitere Optionen könnte man noch -fno-rtti -fexpensive-optimizations setzten. Diese würden den Optimierungsgrad noch weiter erhöhen (hier unnötig).

    Auf chrono könnte man verzichten und stattdessen WinAPI-Code verwenden, mit dem man auch über 1 ms Genauigkeit erreicht.

  • Ich habe es mal im Purebasic versucht, liegt mit Freebasic im gleichen Rahmen denke, war auch nicht anders zu erwarten.

    [autoit]


    OpenConsole()
    StartTime = ElapsedMilliseconds()
    For a = 0 To 3
    i = 0
    While i <> 100000000
    i = i + 10
    Wend
    timer = ElapsedTime = ElapsedMilliseconds()-StartTime
    PrintN("Zeit: "+Str(timer)+" ms")
    timerdurch = timerdurch +timer
    Next
    PrintN("Durchschnitt: "+Str(timerdurch/4)+" ms")
    Input()
    CloseConsole()

    [/autoit]

    Zeit: 31 ms
    Zeit: 47 ms
    Zeit: 63 ms
    Zeit: 78 ms
    Durchschnitt: 54 ms

    :)

  • könntet ihr mal ein beispiel skript in autoit schreiben das die geschwindigkeit in mehreren berreichn (funktionen,verzweigungen,schleifen) am besten testet. ich könnte dieses dann in mehren programmiersprachen schreiben, damit hätte man dann ein besseren vergleich. allerdings fällt mir nicht ein perfektes geshwindigkeitsskript ein.

  • gem
    Im Prinzip sagen solche Test nicht wirklich was aus, zum einem machen sich kaum Unterschieden bei aktuellen CPUs bemerkbar und zu anderen Spielen ganz anderen Faktoren bei einer Programmiersprache, als nur die Geschwindigkeit eine Rolle. Für mich ist das jedenfalls so. Für mich ist die Geschwindigkeit mit der ich ein Programm schreiben kann, viel wichtiger als die Performance des Programms.
    Welchen Ansatz verfolgst du damit eigentlich? :?:

  • @kunstlust

    du hast recht nicht nur die geschwindigkeit ist wichtig, wie du schon sagtest auch das handhaben einer programmiersprachen. allerdings musste ich in letzter zeit viele mathematische berechnungen in kurzer zeit erledigen und dann merkt man wie langsam autoit ist. ich erhoffe mir durch die vergleiche das man sieht welche schleife schneller ist und wie diese im gegensatz zu anderen programmiersprachen sind um dann eventuell programme wo die geschwindigkeit wichtig ist in einer anderen programmiersprachen zu schreiben. mit diesen vielen beispielen kann man sich ja dann eine raussuchen man sieht sehr schnell wie die schleifen in der jeweiligen sprachen aussehen.

  • Ich habe eben gerade mal meinen eigenen, sich in Entwicklung befindenden, AutoIt-Compiler ausprobiert.
    Erst ergab sich kein Geschwindigkeitsgewinn gegenüber AutoIt, nach einer Optimierungsmaßnahme sank die Dauer aber auf ca. 900 ms.
    Zu der Zeit brauchten die AutoIt-skripte ca. 9140 ms, also ungefähr 10-fache Geschwindigkeit.

  • Ich habe mal gerade mit dem bessren Compiler und eigenem Code C++ gemacht.
    Autoit bei mir mit dem Skript oben: 9730.38935165666 ms (Durchschnitt)

    C++ 31ms

    C++

    C++ und inline ASM 7 ms :D
    C++ und inline ASM mit von 100000000 nach 0 runtersubrathieren: 0 ms (nicht mit meiner Methode messbar, was man alles mit Optimierung schaffen kann :thumbup: )
    da sieht man, ASM ist das schnellste (logischer Weise)


    C++ ASM add
    C++ ASM sub

    EDIT: Marthogs C++ "Skript" hat bei mir 19,5ms

    EDIT2: BOOHAAA, ich habe nur das nicht gleich zu kleiner geändert und schon sind es fast meine 30ms, das war wohl an meinem Code nicht so gut.

    • Offizieller Beitrag

    Einen wirklichen Sinn kann ich in dem Vergleich nicht finden. Wie schon gesagt wurde ist es zweifelhaft, ob diese Art des Vergleiches überhaupt realistisch ist.
    Und wozu überhaupt der Speed-Test mit anderen Sprachen?
    Wem AutoIt zu langsam ist (was vermutlich bei 1% der User in wiederum höchstens 1% der Anwendungsfälle wirklich signifikant sein mag), der sollte Inline ASM verwenden und schon flutscht die Sache. :thumbup:

  • BugFix
    Ich denke es ist eine grundsätzliche Frage, ob eine Scriptsprache zum Einsatz kommt. Ich finde es gibt vieles was in AutoIT schnell gemacht ist, kleine Tools um z.B. per API eines Programmes bestimmte Funktion zu ergänzen, oder eine Textdatei nach bestimmten Dingen auszulesen. Und solche Foren wie dieses sind Super, auch wegen solchen Leuten wie dir! Dafür hier noch mal ein Dank an Dich. Complier wie Freebasic und Purebasic sind immer viel schneller als eine Scriptsprache, was ja auch durch den Wegfall der Interpreter Ebene klar ist, sind aber z.B bei Variablen auch viel anspruchsvoller als AutoIT. Darum macht nur eine Geschwindigkeitstest sinn, wie schnell kommen ich in welche Sprache zur Lösung meines Problems und ob die Berechnung 1000ms oder 30ms dauert, spielt keine Rolle, soweit ich es 10x Tag brauche ;)

  • Hi,
    ein Geschwindigkeitsvergleich zwischen einzelnen Programmiersprachen ist imho nicht verkehrt.
    Allerdings sollte man dabei darauf achten, dass im inner loop auch Funktionen verwendet werden, bei denen man nicht davon ausgehen kann, dass die neueren Compiler sie einfach wegoptimieren.
    Wie im vorliegenden Beispiel könnte ich darauf wetten, dass zumindest die Java und C++ - Compiler das Programm analysieren und für den Programmablauf nicht benötigte Teile einfach weglassen...

    Daher sollte man dem inner loop etwas zu tun geben. Mathematische Funktionen, Stringfunktionen, Grafik-Gedöns und bissl Speichergeschiebe hätten das Programm 5 Zeilen länger, aber dafür die Ergebnisse wenigstens in diesem Bereich vergleichbar gemacht.
    Und dann sieht auch AutoIt plötzlich garnicht mehr so langsam aus!
    Sobald nämlich "Standard"-Funktionen (WinAPI) aufgerufen werden, ist deren Laufzeit in allen Sprachen identisch!

    Zitat

    Darum macht nur eine Geschwindigkeitstest sinn, wie schnell kommen ich in welche Sprache zur Lösung meines Problems und ob die Berechnung 1000ms oder 30ms dauert, spielt keine Rolle, soweit ich es 10x Tag brauche

    Genau darauf kommts an...
    Wenn ich erst mal Minuten für den Start eines Compilers und später dann wieder Minuten für (Test)-Compilerläufe verbrate um dann ein Tool zu haben, bei dem es nicht darauf ankommt, ob es 30, 300 oder 1000ms braucht, dann wähle ich natürlich die für mich einfachste (Script)- Sprache!

  • Ich kann mich hier nur Andy anschließen und wie er sagte, muss man erstmal die Rahmenbedingungen für die Tests abstecken und dann die Vergleiche machen.
    Ich persönlich wäre nicht in der Lage in all den oben gelisteten Sprachen zu coden.

    Ich gebe auch BugFix recht, dass man kritische Bereiche bzgl. der Laufzeit optimieren kann, z.B. mit ASM oder DLL's per FreeBasic erstellen und mit AutoIt benutzen.

    Diese Flexibilität ist das Geniale an AutoIt, wobei die anderen Sprachen dies auch beherrschen...


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯