- 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.
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
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
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)
Func RGB2BGR($iColor) ; String - Variante
Local $sH = Hex($iColor,6)
Return '0x' & StringRight($sH, 2) & StringMid($sH, 3, 2) & StringLeft($sH, 2)
EndFunc
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