php, txt datei oder mysql, was ist schneller?
Hallo zusammen
ich bekomme im 500ms einen Seitenaufruf einer php datei von einem esp8266.
Dieser liefert nur eine einzige zahl.
nun müsste ich folgendes szenario vereinfachen:
sammle 4 Daten, rechne den durchschnitt und sende diesen mittels einens http-request
nun die frage:
ist es schneller,
3 txt datein zu erzeugen und beim 4 aufruf diese auslesen und den durchschnitt zu berechnen
oder
1 txt datei zu erstellen, hier immer eine neue zeile reinschreiben und bei der 4 zeile, die einträge addieren und den durchschnitt berechnen
oder
die 4 daten in eine Datenbank mit mysql zu schreiben und anschließend auszurechnen??
danke euch
4 Antworten
Alles was technischen overhead macht ist in dem Fall natürlich langsamer. Es geht um 3 einzelne Zahlen, also eine wirklich minimale Datenmenge.
Theoretisch sollte da in jedem Szenario die Performance keine rolle spielen weil es blitzschnell geht egal wie du es machst.
Ich kann mir auch überhaupt nicht vorstellen, was da jetzt 500ms dauern soll.
In jedem fall ist natürlich 1 HTTP Request schneller als 3 und 1 HTTP Request ist natürlich schneller als 1 HTTP Request und eine Datenbankverbindung aufzubauen, eine SQL Abfrage zu schicken usw.
Eins ist weniger als Vier, eine Kuh zu melken dauert nicht so lange wie Vier zu melken.
Bei einer kleinen Anzahl an Datensätzen wäre das Auslesen/Schreiben einer Textdatei mit beispielsweise CSV-Format schneller als eine Datenbank. Vor allem dann, wenn die Daten nach Berechnung des Mittelwerts nicht weiter persistent gespeichert werden sollen, würde es sich eher lohnen, die Daten so lange wie möglich im Arbeitsspeicher zu halten (Stichwort: Caching).
Bei einer persistenten Speicherung wäre es eine gute Idee, Daten blockweise zu speichern (also erst alle z.B. 50 Datensätze, statt direkt nach jedem Datensatz).
Das schnellste wird da wohl die eine Datei sein. Mehrere Dateien bringen nur zusätzlichen Overhead hinsichtlich öffnen, auslesen, etc. Bei 4 Zahlen in einer Datei sollten die in einen Block passen und direkt gelesen werden.
Datenbank ist auch nur zusätzlicher overhead, der das langsamer macht.
Okay. Alles in einem file korrekt?
Da ich ja nicht weiß, das wievielte mal der wert geschrieben wird, muss ich bei jedem auruf abfragen, wie oft bereits ein eintrag gescgrieben wurde....
1. Datei zum anhängen öffnen, wert anhängen.
2. Datei zum lesen öffnen und nachsehen wieviele Einträge vorhanden sind.
3. Falls 4 Einträge vorhanden, den mittelwert berechnen und Datei leeren
Falls noch keine 4 Einträge, Datei einfach schließen. Korrekt? Das sollte am schbellsten gehen
Wenn das nur 4 ganz normale Zahlen sind kannst du die auch jedes Mal einlesen, zählen, anhängen und wieder rausschreiben.
$data = file("filename");
$count = count($data);
if (count<3) {
$data[] = $current;
file_put_contents("filename", implode("\n", $data));
} else {
$sum = $current;
foreach(data as $v) $sum = $sum+$v;
$avg = $sum/4;
file_put_contents("filename", "");
}
oder so ähnlich...
Wenn das auf dem Controller geht, schreibe das File auf eine Ramdisk...
Okay
Dachte fgetscsv ist schnelle als file put contents... Gibt es eigentliche eine literatur, wielange welche Funktionen brauchen bzw was Ressourcen sparender ist?
Ist eine Abfrage bzw Erstellung alle 500ms sehr "Ressourcen fressend"? Sollte ich es auf 1s verlängern, sodass der esp "nur alle 1s Daten" sendet?Ich habe Angst, das sich der nginx Server aufhängt, wenn das alle 500ms stattfindet
Geschwindigkeit: Selbst ausprobieren, microtime und ein paar 1000 aufrufe in einer Schleife zum Testen helfen.
Das 2. probiere halt auch einfach aus, da nun parallel zu den Testanfragen ne Konsole mitlaufen zu lassen, um mit top den Load anzuzeigen sollte machbar sein. Ich weiss nicht, wie performant ein esp ist.
Die 4 zahlen in form von neuen zeilen oder in einer zeile mit semilion getrennt?
Öffnen, abfragen wie vuele Einträge, schreiben oder rechnen, datei leeren