MB: Performance: Statische Klasse vs. Assoziatives Array

moin,

inwiefern macht es in einer Ablagerungsdatei einen performance unterschied ob ich statische Klassen nehme oder ein array?

Beispiel 1: Statische Klasse

namespace DE;

class Notification {

  /**
   * @var string MESSAGE_SEND
   */
  const MESSAGE_SEND    = 'Nachrich wurde versendet';
  /**
   * @var string MESSAGE_ERROR
   */
  const MESSAGE_ERROR   = 'Fehler bei Versendung der Nachricht';
  /**
   * @var string MESSAGE_
   */
  const MESSAGE_        = '...';
  /* ... */
}

include( 'de/Notification.php' );

Flash {
  const SUCCESS = 'success';
  public static function set( string $type, string $notification ) : void {
    // ...
  }
  public static function get() : array {
    // ...
  }
}

Flash::set( Flash::SUCCESS, \DE\Notification::MESSAGE_SEND );

Beispiel 2: assoziatives Array

return [
  'MESSAGE_SEND'    = 'Nachrich wurde versendet',
  'MESSAGE_ERROR'   = 'Fehler bei Versendung der Nachricht',
  'MESSAGE_'        = '...',
  /* ... */
]
$notifi = include( 'de/notification.inc.php' );

Flash {
  const SUCCESS = 'success';
  public static function set( string $type, string $notification ) : void {
    // ...
  }
  public static function get() : array {
    // ...
  }
}

Flash::set( Flash::SUCCESS, $notifi[ 'MESSAGE_SEND' ] );

Mit einen mächtigen IDE ist es schon schmackhaft das erste Beispiel zu nehmen, da es intellisense + Kommentare zur verfügung stellt. Das zweite Beispiel dürfte weniger rechen aufwand haben aber auch die netten Features nicht haben.

Mit wieviel mehr rechenaufwand hätte ich, wenn ich mich den für das erste entscheiden würde??? Ist es gut verkraftbar? Wenn ihr mehr Daten bräuchtet um etwas konkrete aussagen zutreffen: PHP 7.+ Standard Host mit Standard leitung, alles Standert im EU raum.

lgmb

PS: Bin kein Techniker und miserabel in Netzwerktechnik. Es sein mir verziehen wenn ich Standard gesagt habe.

  1. Hallo MB,

    das müssten wir jetzt benchmarken, um eine qualifizierte Aussage zu machen.

    Das kannst Du auch selbst.

    $start = microtime(true);
    for ($i=1; $i<1000; $i++) {
       // testaktion
    }
    echo "Laufzeit: " . (microtime(true) - $start) . " Sekunden";
    

    Wenn Dir die Laufzeit zu kurz ist um Vergleichbarkeit zu bekommen, erhöhe den Endwert von i schrittweise um Faktor 10.

    Rolf

    --
    sumpsi - posui - clusi
    1. moin,

      das müssten wir jetzt benchmarken, um eine qualifizierte Aussage zu machen.

      Das kannst Du auch selbst.

      ok, um ehrlich zu sein, habe ich das noch nie gemacht. (ge)benchmark(t) Ich versucht. Danke.

      lgmb

      1. Tach!

        das müssten wir jetzt benchmarken, um eine qualifizierte Aussage zu machen.

        Das kannst Du auch selbst.

        ok, um erlich zu sein habe ich das noch nie gemacht.

        Dann fang mal damit an. Mitunter sind gar keine allgemeinen Aussagen treffbar. Vieles hängt von der konkreten Situation vor Ort ab, die selbst schon bei Wiederholung ganz anders aussehen kann. Beim ersten Mal muss vielleicht noch alles geladen werden, weitere Aufrufe erfolgen aus einem Cache. Das ergibt ein unterschiedliches Laufzeitverhalten.

        Im Allgemeinen kann man sagen, dass sich die Performancefrage nur bei lang laufenden Dingen lohnt und/oder bei vielen Wiederholungen. Wenn du keinen Unterschied zwischen zwei Methoden spürst, und zudem für eine Messung sehr viele Wiederholungen benötigen würdest, um überhaupt aus dem Grundrauschen herauszukommen, und in der Praxis eine solche Anzahl Wiederholungen utopisch ist, dann vergiss die Performancefrage. Konzentrier dich dann lieber auf verständlichen Code.

        dedlfix.

        1. moin,

          [...]. Wenn du keinen Unterschied zwischen zwei Methoden spürst, [...], dann vergiss die Performancefrage. Konzentrier dich dann lieber auf verständlichen Code.

          Dankeschön 😉. Werde ich beherzigen

          lgmb

    2. moin,

      ich habs gebenchmarkt um werte heraus zu bekommen allerdigs nuch OOP und ich muss sage das es wirklich nichts wiegt

      lgmb

  2. inwiefern macht es in einer Ablagerungsdatei einen performance unterschied ob ich statische Klassen nehme oder ein array?

    Was ist denn eine Ablagerungsdatei? MFG

    1. moin,

      inwiefern macht es in einer Ablagerungsdatei einen performance unterschied ob ich statische Klassen nehme oder ein array?

      Was ist denn eine Ablagerungsdatei? MFG

      Eine "Ablagerungsdatei" in der Informatik ist eine Datei, in der man Daten für den weiteren Programmverlauf verwenden kann. Ich weis nicht ob es das Wort "Ablagerungsdatei" gibt, jedoch lässt es sich allgemein erschließen - denke ich - welchen Sinn und Zweck das zusammengesetzte Wort hat, deswegen habe ich es verwendet 😉. Ich hätte natürlich den mutmaßlichen Neologismus in Anführungsstriche setzten können, was ich nicht gemacht habe, sorry 😕.

      lgmb

      1. Tach!

        Eine "Ablagerungsdatei" in der Informatik ist eine Datei, in der man Daten für den weiteren Programmverlauf verwenden kann. Ich weis nicht ob es das Wort "Ablagerungsdatei" gibt,

        Hab keine Suchergebnisse gefunden.

        jedoch lässt es sich allgemein erschließen - denke ich - welchen Sinn und Zweck das zusammengesetzte Wort hat, deswegen habe ich es verwendet 😉.

        In jeder Datei sind irgendwelche Dinge (ab)gelagert. Diese Wortschöpfung ergibt keinen Sinn, den das Wort Datei nicht schon hätte.

        dedlfix.

        1. moin,

          Eine "Ablagerungsdatei" in der Informatik ist eine Datei, in der man Daten für den weiteren Programmverlauf verwenden kann. Ich weis nicht ob es das Wort "Ablagerungsdatei" gibt,

          Hab keine Suchergebnisse gefunden.

          schade.

          jedoch lässt es sich allgemein erschließen - denke ich - welchen Sinn und Zweck das zusammengesetzte Wort hat, deswegen habe ich es verwendet 😉.

          In jeder Datei sind irgendwelche Dinge (ab)gelagert. Diese Wortschöpfung ergibt keinen Sinn, den das Wort Datei nicht schon hätte.

          Kannst du einen besseren Vorschlag machen um es auszudrücken?

          lgmb

          1. Tach!

            In jeder Datei sind irgendwelche Dinge (ab)gelagert. Diese Wortschöpfung ergibt keinen Sinn, den das Wort Datei nicht schon hätte.

            Kannst du einen besseren Vorschlag machen um es auszudrücken?

            Datei. Oder du spezifizierst ihren konkreten Verwendungszweck mit allgemeinen Wörtern, wie: Datei mit Meldungstexten.

            dedlfix.

            1. moin,

              In jeder Datei sind irgendwelche Dinge (ab)gelagert. Diese Wortschöpfung ergibt keinen Sinn, den das Wort Datei nicht schon hätte.

              Kannst du einen besseren Vorschlag machen um es auszudrücken?

              Datei. Oder du spezifizierst ihren konkreten Verwendungszweck mit allgemeinen Wörtern, wie: Datei mit Meldungstexten.

              Neben bei bemerkt, guter Rat aber in "manchen" Geisteszuständen extrem schwer umzusetzten mit meiner "Geschichte" 😕. Sorry deswegen.

              lgmb

        2. Hello,

          ich kenne nur "Auslagerungsdatei" oder auch "Overlayfile".
          Das sind Dateien (gewesen), die man benutzt hat, wenn z. Zt. nicht benötigte (statische) Daten den Segmentrahmen (in Zeiten von *.com-Programmen) gesprengt haben.

          Da stellte sich auch die Frage der Performance. Jeder indirekte Zugriff, den man durch einen direktindizierten ersetzen konnte, hat die Geschwindigkeit verbessert. Es mussten nicht erst Adressregister neu geladen und der Stack bedient werden.

          Da PHP keine echten Arrays kennt, müsste man ggf. Überlegen, wie man innerhalb eines Strings ein Displacement als Index nutzen kann, um darin dann z. B. nullterminierte (Null filled) Zeichenketten gleicher Länge unterbringt.

          Spannend war sowas z. B., wenn man den Bildschirm nicht über die BIOS-Funktionen beschrieben hat, sondert direkt per embedded Assembler neu aufgebaut hat.

          Glück Auf
          Tom vom Berg

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
          1. Tach!

            Da stellte sich auch die Frage der Performance. Jeder indirekte Zugriff, den man durch einen direktindizierten ersetzen konnte, hat die Geschwindigkeit verbessert. Es mussten nicht erst Adressregister neu geladen und der Stack bedient werden.

            PHP ist ziemlich weit von der Maschinenebene entfernt. PHP übersetzt sich nicht in Maschinencode sondern in Code, der (derzeit) von einer Engine ausgeführt wird. Ich halte es nicht für sonderlich sinnvoll, nach soweit unten zu schauen, auf das wir als 08/15-PHP-Verwender keinen Einfluss haben.

            Da PHP keine echten Arrays kennt, müsste man ggf. Überlegen, wie man innerhalb eines Strings ein Displacement als Index nutzen kann, um darin dann z. B. nullterminierte (Null filled) Zeichenketten gleicher Länge unterbringt.

            Das halte ich für keine gute Idee, weil das zu viel Aufwand bei der Verwaltung solcher Binärstrukturen mittels PHP-Code bedeutet. Da baust du wohl durch Hilfsvariablen am Ende mehr Indirektionen ein, als du zu umgehen versuchst.

            dedlfix.

      2. moin,

        inwiefern macht es in einer Ablagerungsdatei einen performance unterschied ob ich statische Klassen nehme oder ein array?

        Was ist denn eine Ablagerungsdatei? MFG

        Eine "Ablagerungsdatei" in der Informatik ist eine Datei, in der man Daten für den weiteren Programmverlauf verwenden kann.

        Ok, verstehe. Kein Problem alles schon gehabt. Was hier relevant ist, sind perfomante Serialize-Algorithmen. MFG

        1. Tach!

          Was hier relevant ist, sind perfomante Serialize-Algorithmen.

          Es handelt sich um statische Texte. Code zu benötigen, der diese liest ist wohl nicht performanter, als sie gleich mit dem Code-Parser in eine Struktur zu bekommen. Zudem kann der Code bereits in einem OPCpde-Cache vorliegen, mit Datendateien geht das nicht.

          Viel wichtiger ist die Frage nach der Unterstützung beim Arbeiten. Identifier sind für Analyseprogramme (zum Beispiel Codevervollständigung) einfacher zu fassen, als Schlüsselnamen, die nur als String vorliegen. Ich würde Identifier immer solchen Magic Strings vorziehen, wenn es der Anwendungsfall zulässt.

          dedlfix.

      3. Um Deine ursprüngliche Frage mit einer Nomenklatur zu verbinden:

        1. Class Clips
        2. Clipfile

        MFG

        1. Tach!

          Um Deine ursprüngliche Frage mit einer Nomenklatur zu verbinden:

          1. Class Clips
          2. Clipfile

          Eine Klassendatei kann jede Datei mit einer Klasse darin sein. Das ist als Begriff viel zu allgemein für den vorliegenden Fall, Texte über Schlüssel zugreifbar zu machen.

          Clipfile hingegen ist kein Begriff, für den eine Suche relevante Ergebnisse mit Dateien findet.

          dedlfix.

          1. Hallo,

            Clipfile hingegen ist kein Begriff, für den eine Suche relevante Ergebnisse mit Dateien findet.

            Eigentlich doch, aber da sieht man dann, dass damit Audioschnipsel gemeint sind. Bspw. in Java das Interface 'clip'.

            Gruß
            Kalk

            1. Tach!

              Clipfile hingegen ist kein Begriff, für den eine Suche relevante Ergebnisse mit Dateien findet.

              Eigentlich doch, aber da sieht man dann, dass damit Audioschnipsel gemeint sind. Bspw. in Java das Interface 'clip'.

              Ich bekomme für "clipfile" und "clip file" nur irgendwelche Aktenordner-Ergebnisse. Wie auch immer, jedenfalls wüsste ich auch nichts davon, dass man Key-Value-Sammlungen für Texte mit clip in Verbindung bringen würde.

              dedlfix.

              1. Hi,

                Ich bekomme für "clipfile" und "clip file" nur irgendwelche Aktenordner-Ergebnisse. Wie auch immer, jedenfalls wüsste ich auch nichts davon, dass man Key-Value-Sammlungen für Texte mit clip in Verbindung bringen würde.

                Naja, daß der "einzige erfahrene Programmierer wo gibt auf der Welt" gerne seine eigene Begriffswelt benutzt, ist doch bekannt.

                cu,
                Andreas a/k/a MudGuard

                1. @@MudGuard

                  Naja, daß der "einzige erfahrene Programmierer wo gibt auf der Welt" gerne seine eigene Begriffswelt benutzt, ist doch bekannt.

                  Das pl in pl steht für Parallelwelt.

                  LLAP 🖖

                  --
                  „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
        2. Um Deine ursprüngliche Frage mit einer Nomenklatur zu verbinden:

          1. Class Clips
          2. Clipfile

          Wobei Du Deine Clips (Textbausteine) ohnehin persistent haben musst, wofür sich der Performance wegen eine Datei anbietet. Sofern Du das über eine Klasse organisierst und die Idee finde ich übrigens ganz hervorragend, kannst Du der Klasse weitere Methoden geben zum insert/edit/delete Deiner Clips.

          Schönes Wochenende.

          1. Tach!

            Wobei Du Deine Clips (Textbausteine)

            Versuchst du geade eine neue Bedeutung dem Wort Clip anzudichten? Ein Clip ist neben anderen nicht weiter relevanten Bedeutungen (z.B. Klemme/Klammer für physische Gegenstände) ein Ausschnitt aus einer Ton- oder Videoaufnahme. Für Texte wird das nicht verwendet.

            dedlfix.

            1. Tach!

              Wobei Du Deine Clips (Textbausteine)

              Versuchst du geade eine neue Bedeutung dem Wort Clip anzudichten? Ein Clip ist neben anderen nicht weiter relevanten Bedeutungen (z.B. Klemme/Klammer für physische Gegenstände) ein Ausschnitt aus einer Ton- oder Videoaufnahme. Für Texte wird das nicht verwendet.

              Doch wird es. Siehe clipbrd.exe das speichert auch Texte. Und wie ich schon schrieb, der Begriff Clip ist auch für Textbausteine geläufig. GG

              1. Tach!

                Doch wird es. Siehe clipbrd.exe das speichert auch Texte. Und wie ich schon schrieb, der Begriff Clip ist auch für Textbausteine geläufig.

                Ein Clipboard speichert Ausschnitte. Textbausteine sind keine Ausschnitte von größeren Texten sondern die Grundbausteine, um sie zusammenzusetzen. Ziegelsteine werden beispielsweise auch nicht im Kontext daraus etwas zu bauen als Ausschnitt oder Bruchstück oder dergleichen bezeichnet.

                Die Wikipedia weiß auch nichts von einer solchen Verwendung für Clip.

                dedlfix.

              2. Doch wird es. Siehe clipbrd.exe das speichert auch Texte. Und wie ich schon schrieb, der Begriff Clip ist auch für Textbausteine geläufig. GG

                Genau: Bei meinem Editor TextPad heißen die Textbausteine auch Clip. Man kann sie auch selbst erstellen und in sog. Clipdateien (.clp) speichern.

                Feine Sache übrigens!

                PS: clipbrd.exe ist eher unter dem Begriff Zwischenablage bekannt. Und dann gibt es noch die Clipboard API für JS damit habe ich auch schon gearbeitet.

                Soweit noch zum Begriff.

                1. Tach!

                  Doch wird es. Siehe clipbrd.exe das speichert auch Texte. Und wie ich schon schrieb, der Begriff Clip ist auch für Textbausteine geläufig. GG

                  Genau: Bei meinem Editor TextPad heißen die Textbausteine auch Clip. Man kann sie auch selbst erstellen und in sog. Clipdateien (.clp) speichern.

                  Anderenorts heißen solche Code-Bausteine Snippets. Geht aber auch am vorliegenden Anwendungsfall vorbei. Im Beispiel sind Meldungstexte zu sehen. Dafür kann man das Wort Messages verwenden, was der OP bereits getan hat. Ich sehe keinen Grund hier einen anderen Begriff zu verwenden oder gar einen umzudeuten.

                  PS: clipbrd.exe ist eher unter dem Begriff Zwischenablage bekannt. Und dann gibt es noch die Clipboard API für JS damit habe ich auch schon gearbeitet.

                  Die Zwischenablage und Funktionen zu deren Verwaltung haben nichts mit dem vorliegenden Thema zu tun.

                  dedlfix.

          2. Um Deine ursprüngliche Frage mit einer Nomenklatur zu verbinden:

            1. Class Clips
            2. Clipfile

            Wobei Du Deine Clips (Textbausteine) ohnehin persistent haben musst, wofür sich der Performance wegen eine Datei anbietet. Sofern Du das über eine Klasse organisierst und die Idee finde ich übrigens ganz hervorragend, kannst Du der Klasse weitere Methoden geben zum insert/edit/delete Deiner Clips.

            PS: Auch in Sachen Mehrsprachigkeit: (1) geht in Richtung Klassenerweiterung, also clips_de, clips_en usw. Über (2) bietet sich der Dateiname an wie clips.de, clips.en usw. Es gibt also sowohl für (1) als auch für (2) Möglichkeiten der sprachlichen Erweiterung die man von Anfang an auf dem Schirm haben sollte.

            Schönes Wochenende.

            1. hi @MB

              PS: Auch in Sachen Mehrsprachigkeit: (1) geht in Richtung Klassenerweiterung, also clips_de, clips_en usw. Über (2) bietet sich der Dateiname an wie clips.de, clips.en usw. Es gibt also sowohl für (1) als auch für (2) Möglichkeiten der sprachlichen Erweiterung die man von Anfang an auf dem Schirm haben sollte.

              Hier ein schönes Beispiel zur Mehrsprachigkeit über eine Klassenerweiterung. Fehlermeldung in en//de je nach Einstellung der bevorzugten Sprache im Browser.

              MFG

  3. Hi,

    Beispiel 1: Statische Klasse

    entscheidend ist hier eher, daß die Texte als const deklariert sind.

    Beispiel 2: assoziatives Array Mit einen mächtigen IDE ist es schon schmackhaft das erste Beispiel zu nehmen, da es intellisense + Kommentare zur verfügung stellt. Das zweite Beispiel dürfte weniger rechen aufwand haben aber auch die netten Features nicht haben.

    ich würde eher beim Array den höheren Rechenaufwand erwarten. Hier muß ja bei jedem Zugriff aus dem Array der passende Wert rausgesucht werden, während es bei der const-Lösung direkt klar ist, welcher Wert benutzt werden soll.

    Mit wieviel mehr rechenaufwand hätte ich, wenn ich mich den für das erste entscheiden würde??? Ist es gut verkraftbar?

    Ich vermute, daß der Rechenaufand-Unterschied im Grundrauschen untergeht.

    cu,
    Andreas a/k/a MudGuard