IPS_GetLinkList() mit optionaler ObjektID

Ist die Object_ID gesetzt gibt die Funktion alle Links eines Objects zurück.

Das das ganze ein 4 Zeiler im PHP Skript ist sehe ich hier keinen großen Mehrwert.

paresy

Bei zeitnahen Operationen mit vielen Links ist es nicht besonders schnell immer alle Links zu laden und nach den Links einer Variable zu filtern wenn ich sie disablen will.
Ausserdem wäre es komfortabel.

Hast du da einen Use-Case, in dem die Laufzeit tatsächlich ein Problem darstellt?

paresy

Ja. Ich enable/disable Variablen für die Steuerung meiner SPI Stripes je nach Einstellung. Wenn ich die Links direkt über die ID einstelle geht es schnell. Über den Filter mit IPS_Getlinklist() dauert es länger bis das Webfront aktualisiert wird. In der Funktion werden doch eh alle Links mit den Targets geladen. Da ist es doch leicht noch einen Filter einzubauen. Da es in C programmiert ist geht es bestimmt wesentlich schneller als in PHP. Ich bin mir sicher das ich nicht der Einzige bin der das so sieht.

Da ein Link eigentlich nur genau ein Ziel haben kann, wäre die Methode
IPS_GetLinkListTarget mit Rückgabe

array(LinkID => TargetID); 

anstelle

array(FortlaufendeNummer => LinkID); 

vielleicht recht nützlich.

Du bekommst die TargetID ja über IPS_GetLink($id)['TargetID']. Die IPS_* LowLevel Funktionen sind sehr auf Performance getrimmt und sind auch in PHP sehr schnell. Somit wäre der Performance-Gewinn eher vernachlässigbar. Um echte Performance zu gewinne, müsste sich je TargetID alle Links „mergen“, damit man direkt alle dazugehörigen Links in konstanter Zeit zurückgeben kann. Da fehlt mir jedoch der Use-Case, um diesen eher hohen Aufwand zu gerechtfertigen.

paresy

Dann setze mal alle Links einer Variable auf Disabled und schau Dir das im Webfront an. Mir dauert es zu lange da es ja immer alle Links läd uns ich mit Getlink die TargetID von jedem Link prüfen muss. Auf jeden Fall wäre diese Erweiterung der Funktion eine Verbesserung.

Magst du mal schauen wie lange dieses Skript denn läuft? Vielleicht ist es eher ein WebFront Problem als das foreach über alle Links?

paresy

Ca 3 Sekunden

$arGlitterSettings = array(
                        13401,
                        28025,
                        39361,
                        19952,
                        35847,
                        15008
    ); 
    if ($_IPS['VALUE'] == 107) {
        $arLinks = IPS_GetLinkList();
        foreach ($arLinks as $Link) {
            if (in_array(IPS_GetLink($Link)["TargetID"], $arGlitterSettings)){
                IPS_SetHidden($Link,false);
            } 
        }
}

In Array ist relativ langsam. Ich würde mal probieren, die Werte als Key zu speichern und mit isset zu prüfen. Das KANN (muss aber eben nicht) deutlich schneller sein.

$arGlitterSettings = array(
                        13401 => 'bla',
                        28025 => 28025,  /* optional auch in Value den Wert schreiben*/
                       [...]
    ); 
[...]
if (isset($arGlitterSettings[IPS_GetLink($Link)['TargetID'] ])){
[...]