Frage zu effizientem Programmieren

Hallo,
ist es sinnvoll eine variable mit unset zu löschen, nachdem man sie nichtmehr benötigt oder bringt das gar nichts?
und ist es sinnvoller konfigurationsdateien bzw. die werte in eine datei oder in eine datenbank zu schreiben, was vom programmieraufwand (in meinem fall) einfacher wäre.
kennt ihr vlt. internetseiten, die beschreiben, wie ich meine scripte effizienter schreibe bzw. wie ich sie verbessern und den rechenaufwand verkleinern kann.

grüße,
sebastian

Effizient Programmieren ist eigentlich nicht schwer. Du musst nur wissen was sinnvoll zu optimieren ist und was nicht.
Eine Variable löschen dauert vll. ein paar Nanosekunden, ein Datenbankzugriff kann gut auf 200ms kommen, falls der Server gerade stark belastet ist.

Beim Programmieren geht es in erster Linie nicht um Laufzeit, sondern darum, dass der Code gut erweiterbar, lesbar, etc… ist. Optimieren kann man dann danach auch noch, nachdem man ein paar Laufzeitanalysen gemacht hat

Naja, die Laufzeit ist schon relevant, gerade bei PHP, weil die dort
stark begrenzt ist - und die Geduld der Betrachter auch ;o)

Beim unset ist das ein Abwägen einerseits zwischen dem von der
Variable benötigten Speicher, der Laufzeit der unset-Funktion und
der Erhöhung der Komplexität eines Programmes und des Aufwandes,
die Funktion hinzuschreiben.
Effektiv lohnt sich das, um zum einen Variablen zu beseitigen, die
einen großen Speicherbedarf hatten. Das ist etwa bei der
Bildbearbeitung dringend, oder auch wenn man zunächst die
gesamte Ausgabe in eine Variable schreibt und die dann mehrfach
nachbearbeitet mit weiteren Variablennamen.
Zum anderen ist das hilfreich bei komplexeren Konstruktionen, die
von mehreren Leuten programmiert werden, um auszuschließen,
daß eine Variable versehentlich doppelt genutzt wird. Da man in
solchen Situationen allerdings meist ohnehin mit Funktionen,
Prozeduren oder Modulen arbeitet, die sich gegen das
Hauptprogramm abschotten, also keine globalen Variablen
verwenden, tritt das Problem dort meist nicht auf.

Effizientes Programmieren hängt stark vom Problem ab. Man kann
so ungeschickt programmieren, daß die Laufzeit eines Programmes
um Größenordnungen ansteigt - das kann den Unterschied machen
zwischen einer praktisch funktionierenden Anwendung und einem
gescheiterten Projekt. Solche Programme habe ich - irgendwann
hat mal ein Kollege mit Fachkenntnissen in der verwendeten
Programmiersprache einen intensiven Blick drauf geworfen und
hat durch Umstellung der Indizes von arrays mehr als einen
Faktor 10 rausgeholt. Ist eine ganze Menge, wenn man bedenkt,
daß das komplette Programm auch nach dieser Optimierung auch
heute noch ein paar Stunden läuft - und die Urversion schon älter
als 10 Jahre ist - damals hat man da viel ungenauer gerechnet und
hat Tage auf ein Ergebnis warten müssen, hat teils auch mehrere
Rechner gleichzeitig verwendet/blockiert.

Andererseits - wenn man das Projekt über längere Zeit laufen hat,
muß man es auch später noch zügig verstehen können, wenn man
etwas ändern will - oder jemand anderes dies tun soll - da kann es
dem Verständnis abträglich sein, das Programm zu elegant und
effizient notiert zu haben.

okay, vielen dank für eure antworten.
was sagt ihr zu dem vergleich datei / datenbank auslesen?

grüße,
sebastian

Ich hab doch schon geschrieben, dass Wartezeiten auf eine Datenbank enorm sein können, aber nicht sein müssen :wink:
Das Dateisystem ist aber i.d.R. schneller, solange es nur um einen Datenstrang geht.

es geht darum, dass ich einstellungen für plugins einfach im pluginordner ablegen kann und nicht immer die parameter der plugins in die datenbank schreiben muss. somit kann man den ordner des plugins einfach löschen und hat keine datenreste in der datenbank.
wenn ich die daten aus der datenbank bekommen würde, würde ich allerdings würde die parameter immer am anfang des scripts mitladen, da dort die komplette tabelle mit den einstellungen geladen wird.
so wie du das geschildert hast, ist die erste variante besser, da man das skript problemlos erweitern und auch wieder (das gegenteil von erweitern?) kann.

grüße,
sebastian

Hi,

Mit Präventivem Laden sollte man möglichst wenig laden, um Speicher zu sparen, d.h. wenn dann Plugin-configs nur auf Anfrage…
Bei Performance geht’s im Grunde wirklich nicht um Scriptlaufzeit, sondern auch um Skalierbarkeit…
Beispiel: ich Lade mit PHP eine Datei, die dann an den Browser geschickt wird. Es gibt zwei Möglichkeiten:
a) das 1. Script lädt die volle Datei und sendet sie: ausführungszeit bei 1 Aufruf: 0,4 sec Speicherverbrauch: 10mb
b) das andere Script lädt Zeile für Zeile. Ausführungszeit bei 1 Aufruf: 0,6sec, Speicherverbrauch: 5mb
Nehmen wir an wir haben einen Rechner mit 100mb RAM
Bei 10 Aufrufen wird das 1. Script gleich schnell bleiben, beim 11. Läuft der RAM über und das System muss auslagern, Folge: das 1. Ist deutlich langsamer als das 2. -> das 2. Ist von der Skalierbarkeit besser

Zu PHP-Performance:
I/O ist normal schneller, doch fang nicht an kleine Datenmengen zu cachen, sondern optimier lieber die DB mit indezes
Ein Faktor, der die Ausführungszeit massiv nach unten drückt sind I/O-Zugriffe, also möglichst gering halten
Dann wichtig!: Dateien nicht alle preloaden, sondern per __autoload laden, wenn gebraucht
Das erfordert natürlich eine Objektorientierte Struktur der Anwendung
Was du nicht machen solltest, ist dich mit kleinscheiss wie ’ schneller als " rumzuschlagen, des gibt’s seit PHP 4.2 oder so nicht mehr und ist auch zu gering um es zu spüren
Cachen: caches sind nützlich, aber nur wenn man weiß, wo es sich lohnt zu cachen, z.B. Bei langen Scriptteilen mit vielen Prozeduren wie ein templateparser, aber nicht bei einer foreach-Schleife mit 10 Durchläufen, da ist das Filesystem zu langsam

Um mal rauszufinden, was richtig Zeit braucht kannst du dein Skript ja Profilen, dazu nutze ich z.B für Goma meine eigene Profile-Klasse, wo ich mit Profiler::Mark(“Name”); einen Anfang markiere und mit Profiler::unMark(“Name”); das Ende und dann die Differenz anzeige als Log am Ende

So habe ich z.B. Herausgefunden, dass das Aufbauen der Verbindung zur DB gut 10-30ms dauern kann und das inkludieren einer Datei auch mal 3ms in Anspruch nehmen kann, aber eine Schleife mit 10 durchläufen und 2x preg_Match je durchlauf braucht nur 0,09ms

So kannst du auch zusehen, wo der Speicherbedarf rapide ansteigt, z.B. Beim laden eines großen serialisierten Arrays aus einer Datei

Am Ende kannst du dann dadurch nachvollziehen, wo es sich lohnt zu optimieren