Systemarchitektur-Fragen und: Variablen im Objektbaum vs. Array per include?

Diese Frage geht an die Entwickler von IPSymcon. Mögen vielleicht komisch erscheinen, aber ich habe bei einigen anderen Systemen schon recht schnell Systemgrenzen getestet und würde dem gerne vorbeugen.

Thema:
Grundsätzlich habe ich ja die Option, „meine“ Parametersätze, z.B. die Cross-Referenztabelle „Synonym --> ObjektID“ in einem Array zu halten, das z.B. per include in alle Skripte übernommen wird oder diese Infos (auch zur Dokumentation) in z.B. einem eigenen „Variablenbaum“ abzulegen.

Nun die Fragen:

1.) Welcher Zugriff geht schneller: array oder IPS_GetVariableIDByName gefolgt von GetValue($id) und wie deutlich ist der Geschwindigkeitsunterschied?

2.) Welche Speicherlimits könnten auftreten, wenn die Array Methode benutzt wird, und, sagen wir 1.000 Arrayeinträge (500 Float, 500 String mit je 30Char) nötig wären?

3.) Wieviele Scripte können (grundsätzlich, unabhängig von der Geschwindigkeitseinbusse) parallel verarbeitet werden und welche Speicherlimits gibt es da (z.B. 64k Segmente)?

4.) Gibt es die Möglichkeit (ausser dem Objektbaum) Arrays einmalig zum Zeitpunkt des Systemstarts einzulesen und diese dann permanent als „Globals“ zur Verfügung zustellen (include je script entfällt)?

5.) Gibt es Erfahrungen, was die Größenlimits von Scripts anbetrifft?

Danke
jwka

Array = O(1) (soweit ich weiß eine HashMap)
GetValue = O(1), IPS_GetVariableIDByName = O(n), wobei n die Anzahl der Elemente innerhalb des Parents ist

Das bedeutet aber, dass der Zugriff bei einem gut geordneten System (Etagen\Zimmer\Geräte) auch nicht wesentlich langsamer ist, da dann vielleicht max. 10 Geräte pro Raum einsortiert sind.

Wer alle 1000 Geräte im Root liegen hat, wird da natürlich ein Problem bekommen.

Probier es aus. (PHP: memory_get_usage - Manual)
Default bei PHP ist 16MB. Wenn du mehr brauchst, kannst du es in der php.ini freischalten

Default ist 10 parallele Skripte. Du kannst die Menge aber manuell erhöhen in der settings.xml. (Forum Suche)
Mehr Threads kosten dich in der Regel je Thread ~5MB Speicher im Idle. Bei Ausführung entsprechend mehr. +CPU Overhead

Du kannst die Thread Auslastung unter „Ansicht hinzufügen“ -> „PHP Info“ beobachten.

PHP hat etwas, dass sich Auto-Include nennt. (Für die php.ini)

Ich bin mir ziemlich sicher, dass du das Limit bei PHP nicht erreichen wirst. Da laufen ganz andere Kaliber Software, als die kleinen Skripte (paar tausend Zeilen) die wir hier nutzen :wink:

paresy

Habe ich das richtig verstanden, wenn ich die PHP.INI modifiziere und dort eine php datei angebe, dann stehen die dort gemachten Definitionen von Arrays und Variablen GLOBAL in jedem Script zur Verfügung, ohne dass in einem Script eine entsprechende Definition vorgenommen werden muss?

Ist das der Eintrag „auto_prepend_file“?

Danke
jwka

Jop, ist wie ein require am Anfang jedes Skriptes (siehe auch http://www.ip-symcon.de/forum/f53/automatisches-einbinden-skriptes-andere-7407/).

Ich weiss, ich könnte es ausprobieren. Frage trotzdem:

Wird die mit auto_prepend angegebene Datei EINMAL bei Start von IPS abgearbeitet oder, zwar automatisch aber eben auch mit Ausführungszeit, JEDES MAL, wenn ein Script ausgeführt wird, so, als wäre die auto-prepend Datei Bestandteil des gerade ausgeführten Scripts?

Danke
jwka

Wie gesagt, das arbeitet wie ein require()-Aufruf. Daher wird es bei jedem Skriptaufruf neu ausgeführt.

Ok. Verstanden.

Das ist dann aber NICHT genau das, was ich suche, sondern „lediglich“ eine Verkürzungt des Scripts um die „include/require“-Zeile(n).

Ich mache mal wegen der eigentlichen Frage dahinter einen eigenen Thread auf, um die Suche anderer besser zu unterstützen.

Danke.
jwka

Brauchst Du nicht, es gibt soetwas, wie Du es gerne hättest, nicht in PHP. Für jedes zu startende PHP-Skript wird PHP neu ausgeführt. Und wenn Du denkst, dass IPS/PHP nicht viele Abfragen abkann, darfst Du Dir gerne mal die webfront/data/ips.php ansehen ;).