TD; DR:
Es gab einige Verwirrung darüber, was ich fragte, also hier ist die treibende Idee hinter der Frage:
Ich wollte immer die Frage sein, was es ist. Ich könnte es ursprünglich nicht gut artikuliert haben. Aber die Absicht war schon immer " modularer, getrennter, lose gekoppelter, entkoppelter, umgestalteter Code ", der von Natur aus deutlich langsamer ist als " monolithische Einzeleinheit, alles an einem Ort, eine Datei, eng gekoppelter Code". Der Rest sind nur Details und verschiedene Manifestationen davon, die mir damals oder heute oder später begegnet sind. In gewisser Hinsicht ist es sicher langsamer. Wie bei einer nicht defragmentierten Festplatte müssen Sie die Teile von überall aufheben. Es ist langsamer Sicher. Aber sollte es mich interessieren?
Und die Frage ist nicht über ...
Es geht nicht um Mikrooptimierung, vorzeitige Optimierung usw. Es geht nicht um "diesen oder jenen Teil zu Tode optimieren".
Was ist es dann?
Es geht um die allgemeine Methodik und die Techniken und Denkweisen beim Schreiben von Code, die im Laufe der Zeit entstanden sind:
- "Fügen Sie diesen Code als Abhängigkeit in Ihre Klasse ein"
- "schreibe eine Datei pro Klasse"
- msgstr "trennen Sie Ihre Ansicht von Ihrer Datenbank, Ihrem Controller, Ihrer Domain".
- Schreiben Sie keine spaghetti-homogenen einzelnen Codeblöcke, sondern schreiben Sie viele separate modulare Komponenten, die zusammenarbeiten
Es geht um den Weg und den Stil des Codes, der derzeit - innerhalb dieses Jahrzehnts - in den meisten Frameworks gesehen und befürwortet wird, befürwortet auf Konventionen, die über die Community weitergegeben werden. Es ist eine Verlagerung des Denkens von "monolithischen Blöcken" zu "Mikrodienstleistungen". Und damit einher geht der Preis in Bezug auf Leistung und Overhead auf Maschinenebene und einige Overheads auf Programmiererebene.
Die ursprüngliche Frage lautet:
Im Bereich der Informatik habe ich eine bemerkenswerte Veränderung im Denken in Bezug auf die Programmierung festgestellt. Ich stoße ziemlich oft auf den Rat, der so lautet:
- Schreiben Sie kleineren funktionsbezogenen Code (auf diese Weise überprüfbarer und wartbarer).
- Zerlegen Sie vorhandenen Code in immer kleinere Codestücke, bis die meisten Ihrer Methoden / Funktionen nur noch wenige Zeilen lang sind und klar ist, wozu sie dienen (wodurch im Vergleich zu einem größeren monolithischen Block mehr Funktionen erstellt werden).
- Schreibe Funktionen, die nur eines tun - Trennung von Anliegen usw. (was normalerweise mehr Funktionen und mehr Frames auf einem Stapel erzeugt)
- mehr Dateien erstellen (eine Klasse pro Datei, mehr Klassen für Dekompositionszwecke, für Layer-Zwecke wie MVC, Domänenarchitektur, Entwurfsmuster, OO usw., wodurch mehr Dateisystemaufrufe erstellt werden)
Dies ist eine Änderung im Vergleich zu den "alten" oder "veralteten" oder "Spaghetti" Codierungsmethoden, bei denen Sie Methoden haben, die sich über 2500 Zeilen erstrecken, und große Klassen und Gottobjekte, die alles tun.
Meine Frage lautet:
Wenn es um Maschinencode geht, um Einsen und Nullen, um Montageanweisungen, um Festplattenplatten, sollte ich mir überhaupt Sorgen machen, dass mein perfekt klassengetrennter OO-Code mit einer Vielzahl überarbeiteter Funktionen und Methoden auch generiert wird viel mehr Aufwand?
Einzelheiten
Obwohl ich nicht genau weiß, wie OO-Code und seine Methodenaufrufe letztendlich in ASM verarbeitet werden und wie DB-Aufrufe und Compiler-Aufrufe dazu führen, dass sich der Aktuatorarm auf einem HDD-Plattenteller bewegt, habe ich eine Idee. Ich gehe davon aus, dass jeder zusätzliche Funktionsaufruf, Objektaufruf oder "#include" -Aufruf (in einigen Sprachen) einen zusätzlichen Befehlssatz generiert, wodurch die Codevolumen erhöht und verschiedene "Code-Verkabelungs" -Overheads hinzugefügt werden , ohne tatsächlichen "nützlichen" Code hinzuzufügen . Ich stelle mir auch vor, dass gute Optimierungen an ASM vorgenommen werden können, bevor es tatsächlich auf der Hardware ausgeführt wird, aber diese Optimierung kann nur so viel bewirken.
Daher meine Frage: Wie viel Overhead (in Bezug auf Speicherplatz und Geschwindigkeit) bewirkt gut separierter Code (Code, der auf Hunderte von Dateien, Klassen und Entwurfsmustern usw. aufgeteilt ist), verglichen mit einer einzigen großen Methode, die Code enthält? alles in einer monolithischen Akte ", aufgrund dieses Overheads?
UPDATE zur Verdeutlichung:
Ich gehe davon aus, dass das Aufteilen und Umgestalten desselben Codes , das Entkoppeln desselben in immer mehr Funktionen und Objekte sowie Methoden und Klassen dazu führen wird, dass immer mehr Parameter zwischen kleineren Codeteilen übertragen werden. Refactoring-Code muss den Thread auf jeden Fall am Laufen halten, und dazu müssen Parameter übergeben werden. Weitere Methoden oder mehr Klassen oder mehr Fabrikmethoden Entwurfsmuster, führt zu mehr Overhead von verschiedenen Bits von Informationen vorbei mehr , als es der Fall in einer einzigen monolithischen Klasse oder Methode.
Irgendwo hieß es (Zitat TBD), dass bis zu 70% des gesamten Codes aus dem MOV-Befehl von ASM besteht - das Laden von CPU-Registern mit richtigen Variablen, nicht die eigentliche Berechnung. In meinem Fall laden Sie die CPU-Zeit mit PUSH / POP-Anweisungen, um die Verknüpfung und Parameterübergabe zwischen verschiedenen Codeteilen bereitzustellen. Je kleiner Sie Ihre Codeteile machen, desto mehr Overhead "Verknüpfung" ist erforderlich. Ich bin besorgt darüber, dass diese Verknüpfung zu einer Aufblähung und Verlangsamung der Software beiträgt, und ich frage mich, ob ich darüber besorgt sein sollte und wie viel, wenn überhaupt, weil aktuelle und zukünftige Generationen von Programmierern Software für das nächste Jahrhundert entwickeln müssen mit Software leben und diese konsumieren, die mit diesen Methoden erstellt wurde.
UPDATE: Mehrere Dateien
Ich schreibe jetzt neuen Code, der langsam alten Code ersetzt. Insbesondere habe ich festgestellt, dass eine der alten Klassen eine ~ 3000-Zeilen-Datei war (wie bereits erwähnt). Jetzt sind es 15-20 Dateien, die sich in verschiedenen Verzeichnissen befinden, einschließlich Testdateien und ohne PHP-Framework, das ich verwende, um einige Dinge zusammenzubinden. Weitere Dateien werden ebenfalls kommen. Wenn es um Festplatten-E / A geht, ist das Laden mehrerer Dateien langsamer als das Laden einer großen Datei. Natürlich werden nicht alle Dateien geladen, sie werden nach Bedarf geladen, und es gibt Optionen für das Zwischenspeichern von Datenträgern und für das Zwischenspeichern von Speicher, und dennoch glaube ich, dass dies loading multiple files
mehr Verarbeitung erfordert als loading a single file
Speicher. Ich füge das meiner Sorge hinzu.
UPDATE: Abhängigkeit Alles einschleusen
Ich komme nach einer Weile darauf zurück. Ich glaube, meine Frage wurde missverstanden. Oder vielleicht habe ich einige Antworten falsch verstanden. Ich spreche nicht von Mikrooptimierung, da einige Antworten herausgegriffen haben (zumindest denke ich, dass es eine Fehlbezeichnung ist, wenn ich von Mikrooptimierung spreche), sondern von der Bewegung des "Refactor-Codes zum Lösen der engen Kopplung" als Ganzes auf jeder Ebene des Codes. Ich bin erst kürzlich von Zend Con gekommen, wo diese Art von Code einer der Kernpunkte und Mittelpunkte der Konvention war. Entkoppeln Sie die Logik von der Ansicht, die Ansicht vom Modell und das Modell von der Datenbank. Wenn möglich, entkoppeln Sie die Daten von der Datenbank. Abhängigkeit-Injizieren Sie alles, was manchmal nur das Hinzufügen von Verdrahtungscode (Funktionen, Klassen, Boilerplate) bedeutet, der nichts bewirkt, dient aber als Naht- / Hakenpunkt und verdoppelt in den meisten Fällen problemlos die Codegröße.
UPDATE 2: Beeinträchtigt "Aufteilen von Code in mehrere Dateien" die Leistung erheblich (auf allen Rechenebenen)?
Wie wirkt sich die Philosophie des compartmentalize your code into multiple files
Computing von heute aus (Leistung, Festplattennutzung, Speicherverwaltung, CPU-Verarbeitungsaufgaben)?
Ich rede über
Vor...
In einer hypothetischen und doch realistischen, nicht allzu fernen Vergangenheit könnte man leicht einen Monoblock einer Datei schreiben, die Modell- und Ansichts- und Controller-Spaghetti oder nicht-Spaghetti-codierte Dateien enthält, die jedoch alles ausführen, sobald sie bereits geladen sind. Als ich in der Vergangenheit einige Benchmarks mit C-Code durchführte, stellte ich fest, dass es VIEL schneller ist, eine einzelne 900-MB-Datei in den Speicher zu laden und in großen Blöcken zu verarbeiten, als eine Reihe kleinerer Dateien zu laden und sie in einem kleineren Friedensmahl zu verarbeiten Brocken, die am Ende die gleiche Arbeit machen.
.. Und nun*
Heute schaue ich mir Code an, der ein Hauptbuch anzeigt, das Funktionen wie ... aufweist. Wenn ein Artikel eine "Bestellung" ist, zeige ich den HTML-Block der Bestellung an. Wenn eine Werbebuchung kopiert werden kann, drucken Sie einen HTML-Block, der ein Symbol und HTML-Parameter dahinter anzeigt, damit Sie die Kopie erstellen können. Wenn das Element nach oben oder unten verschoben werden kann, zeigen Sie die entsprechenden HTML-Pfeile an. Ich kann durch Zend Framework erstellenpartial()
calls, was im Wesentlichen bedeutet "eine Funktion aufrufen, die Ihre Parameter aufnimmt und in eine separate HTML-Datei einfügt, die sie auch aufruft". Je nachdem, wie detailliert ich sein möchte, kann ich separate HTML-Funktionen für die kleinsten Teile des Hauptbuchs erstellen. Eine für Pfeil nach oben, Pfeil nach unten, eine für "Kann ich diesen Artikel kopieren?" Usw. Erstellen Sie mühelos mehrere Dateien, um nur einen kleinen Teil der Webseite anzuzeigen. Unter Berücksichtigung meines Codes und des Zend Framework-Codes hinter den Kulissen ruft das System / der Stack wahrscheinlich ungefähr 20-30 verschiedene Dateien auf.
Was?
Ich interessiere mich für Aspekte, die Abnutzung der Maschine, die durch Unterteilen von Code in viele kleinere separate Dateien entsteht.
Wenn Sie beispielsweise mehr Dateien laden, müssen Sie diese an verschiedenen Stellen des Dateisystems und an verschiedenen Stellen der physischen Festplatte ablegen. Dies bedeutet mehr Zeit für das Suchen und Lesen der Festplatte.
Für die CPU bedeutet dies wahrscheinlich mehr Kontextwechsel und Laden verschiedener Register.
In diesem Unterblock (Update Nr. 2) geht es mir genauer darum, wie sich die Verwendung mehrerer Dateien für dieselben Aufgaben, die in einer einzelnen Datei ausgeführt werden könnten, auf die Systemleistung auswirkt.
Verwenden der Zend Form API im Vergleich zu einfachem HTML
Ich habe die Zend Form API mit den neuesten und modernsten OO-Methoden verwendet, um ein HTML-Formular mit Validierung zu erstellen, das POST
in Domänenobjekte umgewandelt wird.
Ich brauchte 35 Dateien, um es zu machen.
35 files =
= 10 fieldsets x {programmatic fieldset + fieldset manager + view template}
+ a few supporting files
All dies könnte durch ein paar einfache HTML- + PHP- + JS- + CSS-Dateien ersetzt werden, möglicherweise insgesamt 4 leichte Dateien.
Ist es besser? Lohnt es sich? Stellen Sie sich vor, Sie laden 35 Dateien und zahlreiche Zend Zramework-Bibliotheksdateien, mit denen sie funktionieren, im Vergleich zu 4 einfachen Dateien.