Hallo,
ich suche nach besserer Performance für mein Skript.
In
wird ein String gespeichert. Die Information aus diesem String soll ausgewertet werden. Mögliche Werte sind von der Art:
,
oder
oder
Dabei nach "output" steht immer eine hexadezimale Zahl: "0FFF", "0004" oder eine andere.
Alles funktioniert, aber nicht ganz schnell, da es viele switch statements gibt. Ich würde mich sehr freuen, wenn jemand mir hinweist, wie ich das besser machen kann.
Eventuell ist das mit bitweisen shift operatoren << und >> machbar. Aber wie?
ich suche nach besserer Performance für mein Skript.
In
Code:
$data
Code:
$data = "output;0FFF"
Code:
$data = "output;0004"
Code:
$data = "input;ON"
Code:
$data = "input;OFF"
PHP-Code:
<?
$var = substr($data,0,6); // In $var steht 'output' oder 'input;'
$hex = substr($data,-5);
//Auswerten und Setzen der Outputs
// Z.B. $data = output;0008
if ($var == 'output') {
SetValueString($id_gerät, $hex);
$bin = base_convert($hex, 16, 2); //Konvertiere hexadezimale Zahl nach binäre.
//Die führenden Nullen werden abgeschnitten (z.B. statt 001001 bekommt man 1001)
//echo "binär ".$bin."\n";
$str = (string)$bin; // Typumwandlung nach String
$arr = array();
if (strlen($str) < 12) { // Wenn die führenden Nullen abgeschnitten sind, dann hänge die
//am Anfang des Strings
switch(strlen($str)) {
case 1:
$str = "00000000000".$str;
break;
case 2:
$str = "0000000000".$str;
break;
case 3:
$str = "000000000".$str;
break;
case 4:
$str = "00000000".$str;
break;
case 5:
$str = "0000000".$str;
break;
case 6:
$str = "000000".$str;
break;
case 7:
$str = "00000".$str;
break;
case 8:
$str = "0000".$str;
break;
case 9:
$str = "000".$str;
break;
case 10:
$str = "00".$str;
break;
case 11:
$str = "0".$str;
break;
}
}
for ($i = 0; $i < strlen($str); $i++) { // Mache aus String ein Array
array_push($arr, substr($str, $i, 1));
}
$arr_rev = array_reverse($arr); // Setze Elemente im Array in umgekehrter Reihenfolge
foreach($arr_rev as $key => $value) { // Kucke, an welchen Stellen die Einsen
//und an welchen Nullen stehen
if ($value == 1) {
switch ($key) { // Key steht hier für port_out
case "0":
SetValueBoolean($id_0, true);
break;
case "1":
SetValueBoolean($id_1, true);
break;
case "2":
SetValueBoolean($id_2, true);
break;
case "3":
SetValueBoolean($id_3, true);
break;
case "4":
SetValueBoolean($id_4, true);
break;
case "5":
SetValueBoolean($id_5, true);
break;
case "6":
SetValueBoolean($id_6, true);
break;
case "7":
SetValueBoolean($id_7, true);
break;
case "8":
SetValueBoolean($id_8, true);
break;
case "9":
SetValueBoolean($id_9, true);
break;
case "10":
SetValueBoolean($id_10, true);
break;
case "11":
SetValueBoolean($id_11, true);
break;
}
}
else {
switch ($key) { // Key ist port_out
case "0":
SetValueBoolean($id_0, false);
break;
case "1":
SetValueBoolean($id_1, false);
break;
case "2":
SetValueBoolean($id_2, false);
break;
case "3":
SetValueBoolean($id_3, false);
break;
case "4":
SetValueBoolean($id_4, false);
break;
case "5":
SetValueBoolean($id_5, false);
break;
case "6":
SetValueBoolean($id_6, false);
break;
case "7":
SetValueBoolean($id_7, false);
break;
case "8":
SetValueBoolean($id_8, false);
break;
case "9":
SetValueBoolean($id_9, false);
break;
case "10":
SetValueBoolean($id_10, false);
break;
case "11":
SetValueBoolean($id_11, false);
break;
}
}
}
}
//Auswerten und Setzen der Inputs
// Z.B. $data = input4;ON
else {
$port_in = substr($data, 5, 1); // Hier wird eine Nummer extrahiert, in diesem Fall $port_in = 4
$status_in = substr($data, 7, strlen($data)-7); // Hier $status_in = ON
echo $port_in."\n";
echo $status_in."\n";
SetValueString($id_gerät, $status_in);
if (trim($status_in) == 'ON') {
switch ($port_in) {
case "0":
SetValueBoolean($id_0 , true);
break;
case "1":
SetValueBoolean($id_1 , true);
break;
case "2":
SetValueBoolean($id_2 , true);
break;
case "3":
SetValueBoolean($id_3 , true);
break;
case "4":
SetValueBoolean($id_4, true);
break;
case "5":
SetValueBoolean($id_5 , true);
break;
case "6":
SetValueBoolean($id_6, true);
break;
case "7":
SetValueBoolean($id_7, true);
break;
case "8":
SetValueBoolean($id_8 , true);
break;
case "9":
SetValueBoolean($id_9, true);
break;
case "10":
SetValueBoolean($id_10, true);
break;
case "11":
SetValueBoolean($id_11, true);
break;
}
}
else {
switch ($port_in) {
case "0":
SetValueBoolean($id_0, false);
break;
case "1":
SetValueBoolean($id_1, false);
break;
case "2":
SetValueBoolean($id_2 , false);
break;
case "3":
SetValueBoolean($id_3, false);
break;
case "4":
SetValueBoolean($id_4 , false);
break;
case "5":
SetValueBoolean($id_5, false);
break;
case "6":
SetValueBoolean($id_6 , false);
break;
case "7":
SetValueBoolean($id_7, false);
break;
case "8":
SetValueBoolean($id_8, false);
break;
case "9":
SetValueBoolean($id_9, false);
break;
case "10":
SetValueBoolean($id_10, false);
break;
case "11":
SetValueBoolean($id_11, false);
break;
}
}
}
?>

Eventuell ist das mit bitweisen shift operatoren << und >> machbar. Aber wie?
Kommentar