Lassen Sie mich ein Beispiel geben, das auf Erfahrung basiert. Die meisten Bibliotheken, die ich von Tag zu Tag benutze, verwenden in irgendeiner Weise OOP. OOP ist in der Lage, die Komplexität zu verbergen, die für viele Domänen erforderlich ist. Es ist kein Mechanismus, der wirklich zur Leistung beiträgt. Was passieren kann, ist, dass eine Bibliothek bestimmte Optimierungen basierend auf der Objekthierarchie verwenden kann, aber zum größten Teil geht es darum, die Komplexität vor dem Benutzer zu verbergen. Nachschlagen von Entwurfsmustern. Dies sind die Mechanismen, die häufig eingesetzt werden, um diese Komplexität zu verbergen.
Nehmen Sie als Beispiel PETSc. PETSc verwendet ein Inspector / Executor-Modell von OOP, bei dem einer seiner Algorithmen die verfügbaren Routinen in einem bestimmten Objekt untersucht und auswählt, welche zur Ausführung der Routine ausgeführt werden sollen. Dies ermöglicht es einem Benutzer, Bedenken zu trennen, zum Beispiel kann die Matrixaktion jede Art von blockierter oder optimierter Routine enthalten und von zahlreichen iterativen Lösern effektiv verwendet werden. Indem der Benutzer die Möglichkeit erhält, seine eigenen Datentypen und Auswertungen anzugeben, werden einige wichtige Routinen beschleunigt und die gesamte Funktionalität der Bibliothek bleibt weiterhin verfügbar.
Ein weiteres Beispiel ist FEniCS und deal.II. Beide Bibliotheken verwenden OOP, um eine große Anzahl von Finite-Elemente-Methoden zu verallgemeinern. In beiden ist alles von Elementtyp, Elementreihenfolge, Quadraturdarstellung usw. austauschbar. Obwohl beide Bibliotheken "langsamer" sind als einige speziell strukturierte FEM-Codes, können sie eine Vielzahl von Problemen lösen, wobei ein Großteil der Komplexität von FEM dem Benutzer unbekannt ist.
Mein letztes Beispiel ist Elemental. Elemental ist eine neue Bibliothek für dichte lineare Algebra, die die Verwaltung von MPI-Kommunikatoren und der Datenposition zu einem sehr einfachen Sprachkonstrukt gemacht hat. Das Ergebnis ist, dass Sie, wenn Sie einen FLAME-Seriencode haben, durch Ändern der Datentypen auch einen Parallelcode über Elemental erhalten können. Noch interessanter ist, dass Sie mit der Datenverteilung spielen können, indem Sie die Verteilung gleich einer anderen einstellen.
OOP sollte als ein Weg betrachtet werden, die Komplexität zu managen, und nicht als Paradigma für den Wettbewerb mit handgewalzten Baugruppen. Auch wenn Sie es schlecht machen, entsteht viel Overhead. Daher müssen Sie das Timing beibehalten und die Mechanismen aktualisieren, mit denen Sie es verwenden.