NEWS
setinteval Zeiten
-
@ticaki Damit die Ausgabe nicht "flackert", baue ich eben etwas ein. Entweder eine Mittelwertbildung, eine Hysterese oder etwas Anderes. "Wesentlich schneller", etwas Anderes fiel mir gerade nicht ein. Ich frage z.B. einen Datenpunkt ab. Mit getState. Das geht in einer kürzeren Zeit als mich die 3 Sekunden "interval" limitieren. ( Hoffe ich mal.)
@laser
Abfragen eines Datenpunktes mit getState() dauert irgendwas im Nanosekunden Bereich -
@ticaki said in setinteval Zeiten:
Nanosekunden
eher nicht.
ich hab mal vor einiger Zeit Messungen gemacht, da hat get/setState so zwischen 10 und 30 ms auf einem NUC mit Celeron benötigt. Auf einem neueren i7 evtl etwas schneller.
Aber Nano-Bereich würde ich bezweifeln.
1.000ms = 1 Sekunde
1.000.000.000 ns = 1 Sekunde
dazwischen gäbe es noch Mikrosekunden -
@ticaki said in setinteval Zeiten:
Nanosekunden
eher nicht.
ich hab mal vor einiger Zeit Messungen gemacht, da hat get/setState so zwischen 10 und 30 ms auf einem NUC mit Celeron benötigt. Auf einem neueren i7 evtl etwas schneller.
Aber Nano-Bereich würde ich bezweifeln.
1.000ms = 1 Sekunde
1.000.000.000 ns = 1 Sekunde
dazwischen gäbe es noch Mikrosekunden -
@oliverio sagte: Mikrosekunden
Es sind wohl eher wenige Mikrosekunden.
Getestet:- RasPi 2: 20 µs
- i7: 0,3 µs
-
@ticaki said in setinteval Zeiten:
Nanosekunden
eher nicht.
ich hab mal vor einiger Zeit Messungen gemacht, da hat get/setState so zwischen 10 und 30 ms auf einem NUC mit Celeron benötigt. Auf einem neueren i7 evtl etwas schneller.
Aber Nano-Bereich würde ich bezweifeln.
1.000ms = 1 Sekunde
1.000.000.000 ns = 1 Sekunde
dazwischen gäbe es noch Mikrosekundenscript.js.Test.Skript_122: 100000 x getState().val in 23ms script.js.Test.Skript_122: while (i++ < 1000000) x = (x+2)/6+i in 8msDas sind dann was? 2,3ns
war N100 Proxmox 1 core
var i=0 var start = new Date().getTime() while (i++ < 1000) { let x = getState('0_userdata.0.Test').val x = (x+2)/6+i setState('0_userdata.0.Test',x) } var sum = new Date().getTime() - start log('code in '+sum+'ms')code in 6ms -
script.js.Test.Skript_122: 100000 x getState().val in 23ms script.js.Test.Skript_122: while (i++ < 1000000) x = (x+2)/6+i in 8msDas sind dann was? 2,3ns
war N100 Proxmox 1 core
var i=0 var start = new Date().getTime() while (i++ < 1000) { let x = getState('0_userdata.0.Test').val x = (x+2)/6+i setState('0_userdata.0.Test',x) } var sum = new Date().getTime() - start log('code in '+sum+'ms')code in 6ms -
@paul53
argh, hast recht habs nicht gerechnet. -
@paul53 Habe versucht, über "htop" auf der Konsole etwas auszuloten. So richtig erkennbar ist das nichts. Vermutlich sind die laufenden Scripte auch dermaßen winzig, so daß man nichts mitbekommt, egal, ob alle 10 Sec. oder 1 Sec. abgefragt.
@laser sagte in setinteval Zeiten:
@paul53 Habe versucht, über "htop" auf der Konsole etwas auszuloten. So richtig erkennbar ist das nichts. Vermutlich sind die laufenden Scripte auch dermaßen winzig, so daß man nichts mitbekommt, egal, ob alle 10 Sec. oder 1 Sec. abgefragt.
Das geht schon :) Lass es einen Tag laufen und schau dir an wieviel CPU-Zeit die Javascript Instanze verbraucht bei mir ist sie auf platz 3 - wenn redis 100h hat, hat shelly 25h und Javascript 8h. Aber ansonsten sieht du mit htop nur wenn es hängt.
-
@laser sagte in setinteval Zeiten:
@paul53 Habe versucht, über "htop" auf der Konsole etwas auszuloten. So richtig erkennbar ist das nichts. Vermutlich sind die laufenden Scripte auch dermaßen winzig, so daß man nichts mitbekommt, egal, ob alle 10 Sec. oder 1 Sec. abgefragt.
Das geht schon :) Lass es einen Tag laufen und schau dir an wieviel CPU-Zeit die Javascript Instanze verbraucht bei mir ist sie auf platz 3 - wenn redis 100h hat, hat shelly 25h und Javascript 8h. Aber ansonsten sieht du mit htop nur wenn es hängt.
@ticaki lasse das heute nochmal laufen. Gestern lag Javascript aber relativ hoch (über Shelly). Aber weit weg von hoher Auslastung.
Ein Problem habe ich noch. Ich vergleiche zwei Zahlenwerte (so der Plan).function akkumess() { let minwert, spannung; let gpiostate, minalarm; gpiostate = getState('rpi2.0.gpio.22.state'/*Gpio 22*/).val; minalarm = getState('javascript.0.Logik.AkkuMin'/*AkkuMin*/).val; minwert = getState('javascript.0.variables.AkkuMinWert'/**/).val; spannung = getState('vedirect.0.V'/*Main or channel 1 (battery) voltage*/).val; //console.log("Min-Wert: " + minwert); //console.log("spannung: " + spannung); //console.log("22 State:" + gpiostate); //console.log("minalarm :" +minalarm); if ((spannung <= minwert) & (minalarm == false)) {Der "minwert" wurde mit einem Komma als Dezimaltrenner gezeigt. Wie das Komma da reingekommen ist, weiß ich nicht.
Da spielt immer noch das Problem rein, wenn einmal etwas gespeichert wurde, bleibt es nach einer Änderung erhalten.
Nach JS Adapter "Restart" ist es dann meist richtig. Aber nicht immer. Wie kann ich einen bestimmten Datentyp "erzwingen" ? Der Vergleich mit dem Komma und dem Punkt klappte natürlich nicht. Wenn sowas unbemerkt bleibt, ist es sehr schlecht. Der Datenpunkt "AkkuMinWert" ist als Zahl deklariert. -
@ticaki lasse das heute nochmal laufen. Gestern lag Javascript aber relativ hoch (über Shelly). Aber weit weg von hoher Auslastung.
Ein Problem habe ich noch. Ich vergleiche zwei Zahlenwerte (so der Plan).function akkumess() { let minwert, spannung; let gpiostate, minalarm; gpiostate = getState('rpi2.0.gpio.22.state'/*Gpio 22*/).val; minalarm = getState('javascript.0.Logik.AkkuMin'/*AkkuMin*/).val; minwert = getState('javascript.0.variables.AkkuMinWert'/**/).val; spannung = getState('vedirect.0.V'/*Main or channel 1 (battery) voltage*/).val; //console.log("Min-Wert: " + minwert); //console.log("spannung: " + spannung); //console.log("22 State:" + gpiostate); //console.log("minalarm :" +minalarm); if ((spannung <= minwert) & (minalarm == false)) {Der "minwert" wurde mit einem Komma als Dezimaltrenner gezeigt. Wie das Komma da reingekommen ist, weiß ich nicht.
Da spielt immer noch das Problem rein, wenn einmal etwas gespeichert wurde, bleibt es nach einer Änderung erhalten.
Nach JS Adapter "Restart" ist es dann meist richtig. Aber nicht immer. Wie kann ich einen bestimmten Datentyp "erzwingen" ? Der Vergleich mit dem Komma und dem Punkt klappte natürlich nicht. Wenn sowas unbemerkt bleibt, ist es sehr schlecht. Der Datenpunkt "AkkuMinWert" ist als Zahl deklariert.@laser sagte: Der Datenpunkt "AkkuMinWert" ist als Zahl deklariert.
Das spielt keine Rolle, wenn er mit Komma dorthin geschrieben wird - dann bleibt es ein String.
@laser sagte in setinteval Zeiten:
Wie kann ich einen bestimmten Datentyp "erzwingen" ?
if(typeof minwert == 'string') minwert = parseFloat(minwert.replace(',', '.'));Das & in Zeile 13 ist falsch. Richtig logisches UND: &&
-
@ticaki lasse das heute nochmal laufen. Gestern lag Javascript aber relativ hoch (über Shelly). Aber weit weg von hoher Auslastung.
Ein Problem habe ich noch. Ich vergleiche zwei Zahlenwerte (so der Plan).function akkumess() { let minwert, spannung; let gpiostate, minalarm; gpiostate = getState('rpi2.0.gpio.22.state'/*Gpio 22*/).val; minalarm = getState('javascript.0.Logik.AkkuMin'/*AkkuMin*/).val; minwert = getState('javascript.0.variables.AkkuMinWert'/**/).val; spannung = getState('vedirect.0.V'/*Main or channel 1 (battery) voltage*/).val; //console.log("Min-Wert: " + minwert); //console.log("spannung: " + spannung); //console.log("22 State:" + gpiostate); //console.log("minalarm :" +minalarm); if ((spannung <= minwert) & (minalarm == false)) {Der "minwert" wurde mit einem Komma als Dezimaltrenner gezeigt. Wie das Komma da reingekommen ist, weiß ich nicht.
Da spielt immer noch das Problem rein, wenn einmal etwas gespeichert wurde, bleibt es nach einer Änderung erhalten.
Nach JS Adapter "Restart" ist es dann meist richtig. Aber nicht immer. Wie kann ich einen bestimmten Datentyp "erzwingen" ? Der Vergleich mit dem Komma und dem Punkt klappte natürlich nicht. Wenn sowas unbemerkt bleibt, ist es sehr schlecht. Der Datenpunkt "AkkuMinWert" ist als Zahl deklariert.@laser
ich weiß nicht, ob das beobachten der Auslastung da tatsächlich ein Hinweis bietet.
Wenn du die Laufzeit deiner Funktion in ms messen möchtest, dann könntest du das folgende einbauenvar start=new Date().getTime(); //hier dein code var end=new Date().getTime(); console.log(end-start);Ein Wert der ein Komma enthält wird immer als String gespeichert.
Du musst das komma erst ein ein . verwandeln. Besser wäre es das bereits an der Quelle zu ändern, wenn aber das von aussen schon so reinkommt, dann halt im Skript"123,45".replace(",",".")Wenn du das dann in einen expliziten Typ umwandeln willst, kannst du den jeweiligen Typ-Konstruktor verwenden
Number("123.45")+5 oder parseFloat("123.45") //parseFloat hat den Vorteil, das es flexibler mit ungültigen Zeichen umgeht parseFloat("3px") // -> 3 Number("3px") // -> NaN -
@laser
ich weiß nicht, ob das beobachten der Auslastung da tatsächlich ein Hinweis bietet.
Wenn du die Laufzeit deiner Funktion in ms messen möchtest, dann könntest du das folgende einbauenvar start=new Date().getTime(); //hier dein code var end=new Date().getTime(); console.log(end-start);Ein Wert der ein Komma enthält wird immer als String gespeichert.
Du musst das komma erst ein ein . verwandeln. Besser wäre es das bereits an der Quelle zu ändern, wenn aber das von aussen schon so reinkommt, dann halt im Skript"123,45".replace(",",".")Wenn du das dann in einen expliziten Typ umwandeln willst, kannst du den jeweiligen Typ-Konstruktor verwenden
Number("123.45")+5 oder parseFloat("123.45") //parseFloat hat den Vorteil, das es flexibler mit ungültigen Zeichen umgeht parseFloat("3px") // -> 3 Number("3px") // -> NaN -
@ticaki lasse das heute nochmal laufen. Gestern lag Javascript aber relativ hoch (über Shelly). Aber weit weg von hoher Auslastung.
Ein Problem habe ich noch. Ich vergleiche zwei Zahlenwerte (so der Plan).function akkumess() { let minwert, spannung; let gpiostate, minalarm; gpiostate = getState('rpi2.0.gpio.22.state'/*Gpio 22*/).val; minalarm = getState('javascript.0.Logik.AkkuMin'/*AkkuMin*/).val; minwert = getState('javascript.0.variables.AkkuMinWert'/**/).val; spannung = getState('vedirect.0.V'/*Main or channel 1 (battery) voltage*/).val; //console.log("Min-Wert: " + minwert); //console.log("spannung: " + spannung); //console.log("22 State:" + gpiostate); //console.log("minalarm :" +minalarm); if ((spannung <= minwert) & (minalarm == false)) {Der "minwert" wurde mit einem Komma als Dezimaltrenner gezeigt. Wie das Komma da reingekommen ist, weiß ich nicht.
Da spielt immer noch das Problem rein, wenn einmal etwas gespeichert wurde, bleibt es nach einer Änderung erhalten.
Nach JS Adapter "Restart" ist es dann meist richtig. Aber nicht immer. Wie kann ich einen bestimmten Datentyp "erzwingen" ? Der Vergleich mit dem Komma und dem Punkt klappte natürlich nicht. Wenn sowas unbemerkt bleibt, ist es sehr schlecht. Der Datenpunkt "AkkuMinWert" ist als Zahl deklariert.Zur Auslastung, glaube mir einfach, mit den Skripten die du schreibst, wirst du da nie ein Problem haben, solange du halt nicht mit setInterval in dem Millisekundenbereich kommst oder Schleifen mit zehntausenden Abfragen benutzt.
Und zu shelly... ich hab 20 Geräte mit 5 Sekundenaktualisierung Großteil davon sind 1/2pm und 2 em3. Da wird einiges an Daten bewegt und das 24/7. Das als Begründung warum es bei mir viel Zeit benötigt.
Wenn du dir tatsächlich Gedanken darüber machst, dann prüfe ab und an ob eine Core oder der Speicher auf 100% Auslastung ist oder der Load Average größter/gleich (beim 3. Wert) 4 dann mußte was machen.
-
Zur Auslastung, glaube mir einfach, mit den Skripten die du schreibst, wirst du da nie ein Problem haben, solange du halt nicht mit setInterval in dem Millisekundenbereich kommst oder Schleifen mit zehntausenden Abfragen benutzt.
Und zu shelly... ich hab 20 Geräte mit 5 Sekundenaktualisierung Großteil davon sind 1/2pm und 2 em3. Da wird einiges an Daten bewegt und das 24/7. Das als Begründung warum es bei mir viel Zeit benötigt.
Wenn du dir tatsächlich Gedanken darüber machst, dann prüfe ab und an ob eine Core oder der Speicher auf 100% Auslastung ist oder der Load Average größter/gleich (beim 3. Wert) 4 dann mußte was machen.