String-Funktionen sind wirklich sauschnell :D

    • Offizieller Beitrag

    Hi,
    ich hatte ja mal mit String-Funktionen eine Funktion RGB_to_BGR erstellt.
    Nun habe ich das nochmals mit Bit-Operationen nachgestellt. Aber die Stringvariante ist unschlagbar. :thumbup:
    Wenn auch ein Unterschied erst ab der 3.ten Nachkommastelle ( 0.03x ms ) erkennbar ist, so ist die Stringvariante doch schneller.

    Fazit:
    Wenn man die Wahl zwischen String- oder anderen Funktionen hat, sollte man immer zu den Stringfunktionen greifen.

    Test
    [autoit]

    Local $aCol[5] = [0x010203,0xff123e,0xabcdef,0x45aabb,0xeeddaa]
    Local $av1, $av2, $t, $ts1 = 0, $ts2 = 0, $min1 = 1000, $max1 = 0, $min2 = 1000, $max2 = 0, $sum1, $sum2
    Local $anzahl = 1000

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

    For $i = 1 To $anzahl
    $sum1 = 0
    $sum2 = 0
    For $j = 0 To 4
    $t = TimerInit()
    RGB2BGR($aCol[$j])
    $sum1 += TimerDiff($t)
    $t = TimerInit()
    _RGB2BGR($aCol[$j])
    $sum2 += TimerDiff($t)
    Next
    $av1 = $sum1 / 5
    $av2 = $sum2 / 5
    $ts1 += $av1
    $ts2 += $av2
    If $av1 < $min1 Then $min1 = $av1
    If $av1 > $max1 Then $max1 = $av1
    If $av2 < $min2 Then $min2 = $av2
    If $av2 > $max2 Then $max2 = $av2
    Next
    ConsoleWrite('String-Variante:' & @CRLF)
    ConsoleWrite('Mittelwert: ' & $ts1 / $anzahl & @CRLF)
    ConsoleWrite('Minimum: ' & $min1 & @CRLF)
    ConsoleWrite('Maximum: ' & $max1 & @CRLF & @CRLF)
    ConsoleWrite('Bit-Variante:' & @CRLF)
    ConsoleWrite('Mittelwert: ' & $ts2 / $anzahl & @CRLF)
    ConsoleWrite('Minimum: ' & $min2 & @CRLF)
    ConsoleWrite('Maximum: ' & $max2 & @CRLF & @CRLF)

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

    Func RGB2BGR($iColor) ; String - Variante
    Local $sH = Hex($iColor,6)
    Return '0x' & StringRight($sH, 2) & StringMid($sH, 3, 2) & StringLeft($sH, 2)
    EndFunc

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

    Func _RGB2BGR($RGB) ; Bit - Variante
    Return '0x' & Hex(BitAND($RGB, 0xFF), 2) _
    & Hex(BitAND(BitShift($RGB, 8), 0xFF), 2) _
    & Hex(BitAND(BitShift($RGB, 16), 0xFF), 2)
    EndFunc

    [/autoit]
  • String-Variante:
    Mittelwert: 0.0105718741819606
    Minimum: 0.00997229023177509
    Maximum: 0.0222176760310871

    Bit-Variante:
    Mittelwert: 0.0117266800559328
    Minimum: 0.011218826510747
    Maximum: 0.0225109786849629

  • String-Variante:
    Mittelwert: 0.00908404559797403
    Minimum: 0.00880000111746046
    Maximum: 0.0318755596032457

    Bit-Variante:
    Mittelwert: 0.00937874785761884
    Minimum: 0.00899555669784847
    Maximum: 0.0302133371699476

    Ich glaube das macht in einem Script nicht so viel aus ^^.

  • Am Ende soll doch wieder eine Zahl als Ergebnis herauskommen und kein String, oder? Dann müsste es so aussehen:

    [autoit]

    Func RGB2BGR($iColor) ; String - Variante
    Local $sH = Hex($iColor,6)
    Return Dec(StringRight($sH, 2) & StringMid($sH, 3, 2) & StringLeft($sH, 2))
    EndFunc

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

    Func _RGB2BGR($RGB) ; Bit - Variante
    $RGB = Int($RGB)
    Return BitOR(BitShift(BitAND($RGB, 0x0000FF), -16), BitAND($RGB, 0x00FF00), BitShift(BitAND($RGB, 0xFF0000), 16))
    EndFunc

    [/autoit]


    Ergebnisse:

    String-Variante:
    Mittelwert: 0.0223632333159661
    Minimum: 0.018996827809121
    Maximum: 0.129681286308735

    Bit-Variante:
    Mittelwert: 0.0184268112288014
    Minimum: 0.0159796845688488
    Maximum: 0.125826047723943

    Edit: Auch bei den Funktionen von BugFix ist bei mir die Bit-Funktion im Mittel schneller

    Spoiler anzeigen

    String-Variante:
    Mittelwert: 0.0217038757719208
    Minimum: 0.0205053994292571
    Maximum: 0.0478273076606105

    Bit-Variante:
    Mittelwert: 0.0212957792121624
    Minimum: 0.019611431061769
    Maximum: 0.0511796890386907

    • Offizieller Beitrag

    Am Ende soll doch wieder eine Zahl als Ergebnis herauskommen und kein String, oder?


    Jein ;)
    Von der Umrechnungsfunktion her und direktem Einsatz als Farbwert brauch ich natürlich keinen String. Ich hab das z.B. eingesetzt um die Farbwerte über ein Inputfeld oder einen Slider zu ändern. Wenn der Slider den Wert ändert, soll dann natürlich im Input der zugehörige Farbwert in Hex-Schreibweise auftauchen - deshalb die Stringrückgabe.

  • Meine Werte ;)

    String-Variante:
    Mittelwert: 0.00840181497828844
    Minimum: 0.00797012204928432
    Maximum: 0.0247826879433891

    Bit-Variante:
    Mittelwert: 0.00878335733814621
    Minimum: 0.00832308214649488
    Maximum: 0.0259854541555726

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • String-Variante:
    Mittelwert: 0.0227603787632228
    Minimum: 0.0211758757048731
    Maximum: 0.100906679480213

    Bit-Variante:
    Mittelwert: 0.0232425070784135
    Minimum: 0.0220698440723612
    Maximum: 0.058163816909691