Wir arbeiten an einer mittelgroßen C ++ - Codebasis (10Mloc), die durch unsere Optimierungsbemühungen gleichmäßig langsam wird .
Diese Codebasis besteht aus einer Reihe von Bibliotheken, die wir kombinieren, um sie zum Laufen zu bringen. Als der allgemeine Rahmen für die Kommunikation dieser Bibliotheken entwickelt wurde, lag ein gewisser Schwerpunkt auf der Leistung, und später, als weitere Teile hinzugefügt wurden, wurde der allgemeine Rahmen nicht wesentlich geändert. Die Optimierung wurde bei Bedarf und im Zuge der Weiterentwicklung unserer Hardware durchgeführt. Dies machte eine teure frühzeitige Entscheidung erst viel später deutlich. Wir sind jetzt an einem Punkt angelangt, an dem weitere Optimierungen viel teurer sind, da große Teile der Codebasis neu geschrieben werden müssten. Wir nähern uns einem unerwünschten lokalen Minimum, da wir wissen, dass der Code im Prinzip viel schneller ausgeführt werden kann.
Gibt es erfolgreiche Methoden, mit denen entschieden werden kann, wie die Entwicklung einer Codebasis zu einer global optimal funktionierenden Lösung erfolgen soll, die nicht leicht durch einfache Optimierungsmöglichkeiten verwechselt werden kann?
BEARBEITEN
Um die Frage zu beantworten, wie wir uns derzeit profilieren:
Wir haben wirklich nur zwei verschiedene Szenarien, wie dieser Code verwendet werden kann, beide peinlich parallel. Die Profilerstellung erfolgt sowohl mit einer über eine große Stichprobe von Eingaben gemittelten Wanduhrzeit als auch mit detaillierteren Läufen (Anweisungskosten, Fehlvorhersagen für Zweige und Caching-Probleme). Dies funktioniert gut, da wir ausschließlich auf unseren extrem homogenen Maschinen (einem Cluster von ein paar tausend identischen Maschinen) arbeiten. Da wir normalerweise alle unsere Maschinen die meiste Zeit schneller beschäftigen, können wir uns zusätzliche neue Dinge ansehen. Das Problem ist natürlich, dass neue Eingabevariationen, wenn sie auftauchen, möglicherweise zu spät kommen, da wir die offensichtlichsten Mikroineffizienzen für die anderen Anwendungsfälle beseitigt haben, wodurch möglicherweise die Anzahl der "optimal laufenden" Szenarien verringert wird.
sloc
. Ich habe es "mittelgroß" genannt, weil ich keine Ahnung habe, was hier als "groß" gilt.