NEWS
(ERLEDIGT!) TypeScript, viele common/global Scripte --> CPU
-
@gombersiob
Sorry, habe den ersten Beitrag jetzt nochmal gelesen. Es ging ja tatsächlich um das Ändern der globalen Scripte. -
@gombersiob sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:
@jey-cee said in TypeScript, viele common/global Scripte --> CPU am Anschlag:
die müssen auch alle neu Kompiliert werden wenn sie in Typescript geschrieben sind
Hieße doch, sie in JavaScripts zu transformieren könnte eine Lösung sein?
Jein, wird es durch den typescript transpiler ja sowieso
Vorteil ist, das Pakete für sich kompiliert werden und erst neu kompiliert werden. Wenn es Änderungen gibt.Ja, die Iobroker Skripte müssen neu gestartet werden.
Dann liegt aber der Performance schlucker nicht im kompilieren sondern an den Aktivitäten der Skripte selbst und bei jedem Neustart one Änderung oder nicht, geht die Performance weg.Soweit ich es verstanden habe, werden die Common und global Skripte einfach vor jedes Skript kopiert.
-
@oliverio sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:
werden die Common und global Skripte einfach vor jedes Skript kopiert.
doch nicht common!
-
@oliverio said in TypeScript, viele common/global Scripte --> CPU am Anschlag:
Ja, die Iobroker Skripte müssen neu gestartet werden.
Dann liegt aber der Performance schlucker nicht im kompilieren sondern an den Aktivitäten der Skripte selbst und bei jedem Neustart one Änderung oder nicht, geht die Performance weg.Aber die Scripte machen doch in der Regel nichts beim Neustart. Meine haben eigentlich alle einen Trigger, die laufen nicht einfach so los.
Soweit ich es verstanden habe, werden die Common und global Skripte einfach vor jedes Skript kopiert.
Die "Common"-Scripte sind ja die laufenden Scripte. Es werden, wie ich hier lerne die "Global"-Scripte vor jedes Common-Script kopiert.
-
@gombersiob sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:
Aber die Scripte machen doch in der Regel nichts beim Neustart
doch! sie weden kompiliert
-
@gombersiob sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:
die "Global"-Scripte vor jedes Common-Script kopiert.
auch vor alle Skripte, die im Wurzelverzeichnis liegen
-
@homoran sagte: auch vor alle Skripte, die im Wurzelverzeichnis liegen
... oder in jeder anderen Gruppe als "global".
-
@homoran sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:
Aber die Scripte machen doch in der Regel nichts beim Neustart
doch! sie weden kompiliert
Aber nur wenn es Änderungen gibt...
Ansonsten wird die Version aus dem Cache genutzt.
-
@armilar sagte: Ansonsten wird die Version aus dem Cache genutzt.
Das betrifft anscheinend den Precompiler TypeScript --> Javascript.
Skripte werden bei jedem Neustart kompiliert, da beim Stoppen der RAM freigegeben wurde. -
Ich habe aus ca. 40 (kleineren) Common-Scripte ca. 25 (größere) gemacht und von 8 global Scripten auf 5 reduziert.
Ich laufe nun zumindest nicht mehr in das CPU-Problem rein. Das Speichern nach dem Ändern eines Global-Script dauert nun ca. 5 Minuten.
Übrigens, das Ändern von Common-Scripten ist nie ein Problem, auch vor der "Optimierung" nicht.
-
Generell mache ich sehr viel mit Scripten und stoße aktuell an Grenzen mit den Rahmenbedingungen:
- TypeScript
- ca. 40 common-Scripte
- ca. 5-8 global-Scripte (mit teilweise bis zu 3000 Zeilen Code)
Ich spiele in einer anderen ioBroker-Umgebung mit dem Thema "messageTo" herum mit dem Ziel ganz auf global-Scripte verzichten zu können.
Ist ein wenig ein konstruiertes Beispiel, aber ganze Klassen(-inhalte) bekommt man nicht verschickt, oder? Sondern vermutlich nur "primitive" Datentypen oder vermutlich json?
export class TestPosition { private threeQuarter: number; private half: number; private oneQuarter: number; constructor(threeQuarter: number, half: number, oneQuarter: number) { this.threeQuarter = threeQuarter; this.half = half; this.oneQuarter = oneQuarter; } public getThreeQuarter() : number { return this.threeQuarter; } public getHalf() : number { return this.half; } public getOneQuarter() : number { return this.oneQuarter; } } //var data = "uwe"; var data = new TestPosition(10,20,30); messageTo({ instance: 'javascript.0', script: 'script.js.common.Test2', message: 'message1' }, data, {timeout: 1000}, result => console.log(JSON.stringify(result)));
//@ts-expect-error onMessage('message1', (data, callback) => { console.log(`UWE !!! Received data: ${data}`); callback({ result: Date.now() }); var my = data.getThreeQuarter(); log("YIPIEEEEEEEEEEEEEEEEEE: " + my); });
Error in callback: TypeError: data.getThreeQuarter is not a function
-
@uwe72 sagte: ca. 5-8 global-Scripte (mit teilweise bis zu 3000 Zeilen Code)
Das ist eindeutig viel zu viel. Dafür sind "globale" Skripte nicht vorgesehen.
So viele häufig verwendete eigene Funktionen? -
Bitte löschen.
-
@uwe72
Ist die Struktur der ioBroker-Objekte inkl. Aufzählungen so schlecht, dass man eigene globale Datenstrukturen benötigt? -
@uwe72
Hab das da zwar noch nicht probiert, aber als ich das mit Funktionen ausprobiert habe, hat es nicht funktioniert. Dann wird es IMHO wohl auch nicht mit Klassen gehen. -
@paul53 Hab das Beispiel noch ausgetauscht. Es ist nicht nur Datenstruktur, sondern auch viel Logik für generische Anwendungszwecke. Z.B. generische Alexasteuerung über IOT-Adapter, d.h. man gibt nur Alexanamen an und alles andere funktioniert automatisch (Registrierung der Datenpunkte im iot-Adapter, Lampen ein/aus,...).
Kann dennoch drüber nachdenken wie ich es schaffe, das aus dem global-Bereich rauszubekommen, zumindest große Teile davon nach common zu verschieben.
Ob, man mein Beispiel nun gut oder schlecht findet, wollte ich nur darauf hinweisen, dass ich eben mit den Rahmenbedingungen an Grenzen stoße.
Vielleicht stoßen andere mit "sinnvollen" Anwendungszwecken eben auch mal an diese Grenzen.
-
@uwe72 sagte in TypeScript, viele common/global Scripte --> CPU am Anschlag:
gut oder schlecht findet
ist jetzt nicht die Frage.
Aber im Prinzip scheinst du ganze Programmteile von ioBroker mit eigenen Funktionen überstülpen zu wollen.
-
@homoran Alles gut
-
@oliverio habe deinen Hinweis mal ein wenig verfolgt. Habe es prinzipiell auch hinbekommen ein eigenes Modul auf https://www.npmjs.com/ anzulegen. Dieses Modul habe ich dann in ioBroker der Instanz hinzugefügt und konnte auch auf die Inhalte des Moduls innerhalb der ioBroker Scripte zugreifen. War allerdings alles mit JavaScript.
Was ich gerade gar nicht hinkriege ist, das Ganze noch mit Typescript zu machen. Müsste dies grundsätzlich funktionieren?
-
@uwe72
Ah ok, sogar auf NPM publiziertNPM hat auch die Möglichkeit, Pakete einfach auf der Festplatte über Dateipfad zu referenzieren. Das meinte ich eigentlich.
Klar geht das auch mit Typescript.
Aber du weißt, dass Typescript nativ nicht ausgeführt wird, sondern vorher erst nach Javascript transpiliert werden muss.
Dazu werden im Paket entsprechende Tools installiert, die das dann voll automatisch machen.Es gibt ja einige Adapter, die in Typescript erstellt worden sind. Da kannst du mal schauen.