it-swarm-eu.dev

Was sind die Vorteile der Multi-File-Programmierung?

Ein anderer C-Programmierer hat mir gesagt, ich solle große Anwendungen in verschiedene .c- und .h-Dateien schreiben und sie dann zusammen kompilieren. Sie sagen, es wird schneller laufen.

Läuft eine Multifile-Anwendung schneller als eine Singlefile-Anwendung? Wenn ja, wie läuft es schneller? Welche weiteren Vorteile bietet die Programmierung mehrerer Dateien?

Welche Plattform (en) beeinträchtigen C-Programme mit mehreren Dateien die Leistung?

  • Wird eine Windows-Anwendung mit mehreren Dateien schneller ausgeführt als eine Anwendung mit nur einer Datei?
  • Wird eine MacOS-Anwendung mit mehreren Dateien schneller ausgeführt als eine mit einer einzelnen Datei?
  • Wird eine Ubuntu-Anwendung mit mehreren Dateien schneller ausgeführt als eine mit einer einzelnen Datei?
21
Asadefa

Es gibt viele technische Gründe für die Verwendung mehrerer Dateien beim Schreiben großer komplexer Systeme. Alle von ihnen sind angesichts des besten Grundes, mehrere Dateien zu verwenden, bedeutungslos:

Lesbarkeit.

Wenn ich Code schreibe, der sich in einer Datei befindet, präsentiere ich Ihnen, was Sie verstehen müssen, um zu verfolgen, wie dieser Teil des Systems funktioniert. Jedes Detail, das nicht in dieser Datei enthalten ist, wird abstrahiert und mit einem guten Namen dargestellt, der sicherstellen soll, dass Sie immer noch verstehen können, was hier passiert, ohne die Nase in die anderen Dateien zu stecken.

Wenn ich das nicht getan habe, habe ich beschissenen Code geschrieben und du solltest mich dafür anrufen. In solchen Fällen nützen Ihnen mehrere Dateien selten etwas.

Ohne diese Überlegung kann ich das gesamte Programm in eine Datei schreiben. Die CPU kümmert sich nicht darum. Es wird die Menschen nur unglücklich machen, wenn sie versuchen, es zu lesen.

Der traditionelle technische Grund besteht darin, Code in unabhängig bereitstellbare Einheiten zu unterteilen, die sich ändern können, ohne das gesamte System erneut bereitstellen zu müssen. Es gibt Fälle, in denen dies sehr wichtig ist, z. B. wenn Ihre Software auf vielen Chips gebrannt ist und Sie nicht alle Chips wegwerfen möchten, nur weil man sie ändern muss.

Durch die unabhängige Bereitstellung können Kompilierungen schneller ausgeführt werden, da Sie nur die Änderungen neu kompilieren müssen.

Selbst in diesen Fällen würde ich dennoch argumentieren, dass der größte Vorteil darin besteht, eine Grenze zu schaffen, die begrenzt, was Sie von Ihren Lesern erwarten, dass sie zu einem bestimmten Zeitpunkt im Kopf bleiben.

TL; DR Wenn Sie mehrere Dateiprogramme stören, weil Sie ständig in mehreren Dateien suchen müssen, um sie zu verstehen, sehen Sie einfach schlecht abstrahierten Code mit schlechten Namen. So sollte es sich nicht anfühlen. Jede Datei sollte eine Geschichte aus einer Perspektive erzählen.

70
candied_orange

Die Frage fällt in dieselbe Kategorie wie warum werden Gebäude nicht aus einem Stück Stein gebaut, sondern aus einem Haufen Ziegel?

Antworten:

  • einfacher zu navigieren als durch eine riesige Datei zu scrollen
  • make recompile funktioniert nur bei Dateien, die sich auf die Änderung beziehen
  • verschiedene Teile des Programms können von verschiedenen Personen programmiert werden
  • code aus einigen Dateien kann zur zukünftigen Wiederverwendung in Bibliotheken abgelegt werden
  • beim Kompilieren zeigt ein Fehler an, in welcher Datei das Problem liegt (leichter zu finden).
  • zur Kompilierungszeit benötigt der Compiler viel weniger Speicher (weniger Hardwareanforderungen).
  • zur Kompilierungszeit kann der Compiler den Code leichter analysieren (schneller).

Dies ist nur von oben - es gibt definitiv mehr Vorteile auf Lager.

27
Polar Bear

Die anderen Antworten sind in Ordnung, aber etwas, das ihnen fehlt, sind tatsächliche technische Einschränkungen.

Beispielsweise können Sie nicht den gesamten Code für meine Tagesanwendung in einer Datei speichern - er ist größer als die Dateigrößenbeschränkungen gängiger Dateisysteme. Diese Größe führt auch zu Chaos bei Editoren, Compilern und Lintern, da der Syntaxbaum für diesen Code noch größer ist! Und dann gelangen Sie zur Quellcodeverwaltung und zu verschiedenen Tools, die versuchen, Dutzende von Textauftritten in einer Sitzung zu bearbeiten. Da Sie in C arbeiten, müssen Sie sich auch um Ihre tatsächliche Binärgröße kümmern. Die meisten Betriebssysteme haben eine Größenbeschränkung ausführbar, die von der Größenbeschränkung des Dateisystems getrennt ist.

Dies ist natürlich ein Ausreißer. Mehrere Dateien sollen in erster Linie das Leben von Programmierern erleichtern, aber ich hoffe, dies gibt Ihnen ein besseres Gefühl dafür, was "große Anwendungen" bedeuten können.

21
Telastyn

Mir wurde gesagt, dass ich große Anwendungen in verschiedenen Dateien schreiben soll. Sie sagen, es wird schneller laufen. Was macht es schneller laufen?

Läuft eine Multifile-Anwendung WIRKLICH schneller als eine Singlefile-Anwendung?

In C gibt es keinen Grund anzunehmen, dass eine Anwendung mit mehreren Quelldateien schneller ausgeführt wird, und mehrere Gründe, warum sie möglicherweise etwas langsamer ist. Die Verwendung mehrerer Dateien dient dem Komfort der Entwickler.

Es gibt sogar einige Build-Systeme, mit denen Sie mehrere Dateien schreiben können, die zu einer einzigen großen Datei zusammengefasst werden, bevor sie an den Compiler übergeben werden. Dies kann als "Einheit" oder "Verschmelzung" bezeichnet werden.

Der Hauptgrund ist Inlining : Ersetzen eines Aufrufs einer Funktion durch eine Kopie der Funktion. C integriert normalerweise keine Funktionen aus verschiedenen Quelldateien, es sei denn, der Linker ist dafür konfiguriert. Diese Funktion wird in GCC als "Verbindungszeitoptimierung" bezeichnet.

Andere Kommentatoren haben die Idee erwähnt, nicht verwendete Bits des Programms nicht zu laden. Die von den Quelldateien bereitgestellte Funktionsgruppierung wird jedoch möglicherweise nicht in der ausführbaren Datei beibehalten. es sei denn, Sie verwenden ein "Overlay" System (meistens veraltet) oder Sie haben einige Funktionen in "Plugins" unterteilt.

Unter Linux und anderen Systemen mit virtuellem Speicher kann das Betriebssystem nicht verwendete Teile des Programms selbst entladen.

Es gibt auch einige kleinere Vorteile, die durch Dinge wie die konstante Deduplizierung von Zeichenfolgen möglich sind. Auch hier können Sie den Linker damit beauftragen, aber er ist möglicherweise nicht standardmäßig aktiviert.

Probleme mit der Build-Geschwindigkeit sind erwägenswert. Wenn Sie ein Programm in N Dateien aufteilen, wobei N möglicherweise im Bereich von 100 bis 10.000 liegt, ist das Kompilieren einer Datei normalerweise viel schneller als das Kompilieren aller N Dateien. In einigen Fällen ist das Sammeln aller N-Dateien in einer großen Datei jedoch schneller als das separate Kompilieren aller Dateien - vorausgesetzt, der Compiler stürzt nicht ab. Dies ist in C++ tendenziell wichtiger, wo die Kompilierungszeiten viel länger sein können.

In der Praxis teilen Entwickler Quelldateien, weil sie dadurch einfacher zu bearbeiten sind. Die Meinungen variieren, aber 1.000 Zeilen sind eine gute Richtlinie, um über das Teilen einer Datei nachzudenken.

11
pjc50

Die Verwendung mehrerer Dateien für ein Programm bietet zahlreiche Vorteile. Zum Beispiel:

  • wenn Sie Code für eine Klasse in eine separate Datei schreiben, können Sie diese Klasse in mehreren Programmen verwenden. Es erhöht die Wiederverwendbarkeit des Codes.
  • Wenn Sie etwas in einer Klasse ändern möchten, müssen Sie es nur in dieser bestimmten Datei ändern, und die Änderung wird automatisch in allen Projekten übernommen, die auf diese Datei verweisen.
  • Darüber hinaus ist es ratsam, große komplexe Programme in mehrere kleinere Dateien zu schreiben.
  • Und nicht zuletzt arbeiten in großen Organisationen mehrere Programmierer an einem Projekt. In solchen Szenarien ist jeder Programmierer für das Entwerfen bestimmter Module verantwortlich. Daher sind separate Dateien für jeden Programmierer bequem zu codieren und anschließend zu integrieren.

Weitere Argumente finden Sie in dieser Artikel .

2
5hifaT

Ein weiterer wichtiger Grund, mehrere Dateien zu verwenden, die irgendwie niemand erwähnt hat:

Wenn Sie mit einem Team an einem Softwareentwicklungsprojekt arbeiten, wird häufig ein Versionskontrollsystem wie Git verwendet. Eine große Hürde für jedes VCS ist die Zusammenführung der Arbeit mehrerer Autoren. Wenn Sie und ein anderer Entwickler gleichzeitig an derselben Datei arbeiten, muss Ihre Arbeit schließlich zusammengeführt werden. In einigen Fällen können Sie beide denselben Teil derselben Datei bearbeiten, was zu Zusammenführungskonflikten führen kann: Situationen, in denen das VCS nicht automatisch bestimmen kann, wie die Änderungen zusammengeführt werden sollen, und ein Mensch dies tun muss mach es manuell.

Wenn sich Ihr gesamter Code in einer Datei befindet, besteht ein erhöhtes Risiko für Zusammenführungskonflikte. Jeder, der an dem Code arbeitet, arbeitet an derselben Datei. Dies erhöht die Wahrscheinlichkeit, denselben Code gleichzeitig zu bearbeiten oder sich gegenseitig auf die Zehen zu treten. Selbst jemand, der an einem anderen Teil der Datei arbeitet, kann versehentlich etwas tun, das Ihre Arbeit beeinträchtigt. Beispielsweise formatieren sie die gesamte Datei automatisch, benennen eine von Ihnen bearbeitete Funktion um, organisieren den Code neu und verschieben Funktionen usw.

Das Aufteilen des Codes in logische Systeme, die auf mehrere Dateien aufgeteilt sind, verringert das Risiko von Zusammenführungskonflikten, die durch mehrere Personen verursacht werden, die gleichzeitig an derselben Datei arbeiten. Dies erleichtert auch das Lösen von Zusammenführungskonflikten, da weniger Code in jeder Datei kleinere Konflikte bedeutet, die leichter zu lösen sind.

Hier ist ein Worst-Case-Szenario, auf das ich leider schon einmal gestoßen bin: Sie haben eine Datei mit 10.000 Zeilen, an der Tom und Sally arbeiten. Sie verbringen jeweils mehrere Stunden damit, umfangreiche Änderungen an verschiedenen Teilen des Codes vorzunehmen. Irgendwann bemerkt Tom einen Einrückungsfehler und drückt gewöhnlich den Hotkey "Auto-Format", der die Einrückung, Zeilenumbrüche usw. für die gesamte Datei ändert. Später, wenn beide ihren Code festschreiben, tritt ein Zusammenführungskonflikt auf, da das automatische Format von Tom fast jede Codezeile in der gesamten Datei geändert hat und das VCS nicht herausfinden kann, wie die Änderungen zusammengeführt werden sollen. Entweder Tom oder Sally müssen jetzt Stunden Zeit damit verbringen, 10.000 Codezeilen manuell zusammenzuführen. Wenn der Code in mehrere Dateien aufgeteilt worden wäre, hätten sie möglicherweise überhaupt keinen Konflikt gehabt, und selbst wenn dies der Fall gewesen wäre, hätte dies die gesamte Codebasis nicht beeinflusst.

2
user45623

Im Allgemeinen kommt es auf den Kontext an. Zusätzlich zu den anderen Antworten in Javascript wird python und andere Sprachen, von denen ich wahrscheinlich nicht weiß, dass eine importierte Datei nur einmal geladen wird. Nehmen wir an, wir müssen eine Datei mit 150000 Wörtern importieren. Das Laden in eine Variable (oder Datenstruktur) dauert ungefähr 1 Sekunde. Anschließend möchten wir anhand dieser Datei feststellen, ob sich in diesen 150000 Einträgen ein Wort befindet. Außerdem müssen wir diesen gesamten Prozess 1000 Mal wiederholen, was ungefähr 1000 bedeutet Sekunden benötigt. Da wir jedoch die 150000-Eintragsdatei als Variable aus einer anderen Datei importieren, dauert der gesamte 1000-Schritte-Prozess ungefähr 1 Sekunde.

Beachten Sie jedoch, dass die restlichen Antworten eine wesentlich wichtigere Begründung für Ihre Frage liefern.

0
Cap Baracudas

Selbst wenn wir über komplexe Code-Navigationswerkzeuge wie Jump-to-Definition verfügen, erleichtert die Organisation Ihres Projekts in einem Baum von Dateien und Ordnern die Einbindung neuer Entwickler. Es macht es einfacher zu finden, welche Datei Sie benötigen, um an einer Funktion zu arbeiten.

Was das "schnellere" Problem betrifft, unterstützen die meisten modernen Compiler LTO. Selbst wenn Sie separate Kompilierungseinheiten verwenden (Beschleunigung der Kompilierung während des Debuggens), wird die resultierende ausführbare Datei beim Einschalten von LTO mit derselben Geschwindigkeit ausgeführt.

0

Vieles kommt nur auf Folgendes an:

  • Sie möchten in der Lage sein, einfach zu verschiedenen logischen Teilen Ihres Programms zu navigieren und diese Teile nebeneinander anzuzeigen
  • es ist einfacher, eine IDE-/Programmierumgebung zu erstellen, die sich mit diesen separaten Teilen befasst as separate Dateien, als eine IDE, die den gesamten Code für ein Programm enthält) eine große Datei und muss Teile dieser Datei nebeneinander usw. anzeigen.

In vielen Fällen wäre es absolut kein Problem, Ihren gesamten Code in einer realen Datei auf der Festplatte zu haben, wenn Ihre IDE) Ihnen leicht dabei helfen könnte, durch diese Datei zu navigieren und verschiedene Teile der Datei anzuzeigen Seite an Seite.