Manchmal werden Software-Performance-Tricks anhand einer methodischen und gründlichen Suche gefunden. Manchmal erfordert es abweichendes Denken und Mut, verrückte Ideen auszuprobieren. Manchmal ist eine Idee nur der Anfang, dem mit viel harter Arbeit gefolgt werden muss.
Wie kann ein Zeitraum gefördert werden, in dem jeder verschiedene Ideen ausprobieren kann, um die Leistung der Software, an der wir arbeiten, zu verbessern? Jeder im Team hat mindestens einige Monate Erfahrung mit der Software und ist sehr gut darin.
Stimmen Sie zu, dass abweichendes Denken dazu beitragen wird, die Leistung von Software zu verbessern? Warum? Warum nicht?
Mit welchen Techniken können wir eine Optimierungsidee schnell ausprobieren? Ist eine schnelle Codierungsgeschwindigkeit erforderlich, um gute Ergebnisse beim Testen zu erzielen?
Wie viel "Zeit" sollte schließlich aufgewendet werden, um gute Ergebnisse zu erzielen, ohne die Möglichkeit eines Nachlassens zu schaffen?
Sind Experimente notwendig, um zu beweisen, dass es "eine schnellere Möglichkeit gibt, etwas zu tun"? (Hinzugefügt am 07.06.2011)
Verbunden:
- Was sind Ihre Strategien, um das Niveau Ihres Teams auf clevere Weise zu verbessern?
- Wann werden Code-Hacks schlecht?
( Nur für Kopfgeldzwecke - 2011/06/07 beträgt die Teamgröße 2 bis 4 Entwickler, keine dedizierte Qualitätssicherung. Alle Code-, Komponententests und Leistungstests werden von Entwicklern durchgeführt. Aufgrund der Art des Projekts ist das Profiler-Ergebnis hilfreich für die Anzeige proportionale Ausführungszeit, auch wenn kein einziger Engpass erkennbar ist.)
quelle
Antworten:
Am besten identifizieren Sie die Hotspots mit einem Profiler und besprechen im Team, wie die Hotspots repariert werden.
Sie müssen in der Lage sein, die Verbesserung zu messen und zu dokumentieren (es ist also nicht nur ein wildes Raten), und wenn Sie dies als Team tun, stellen Sie sicher, dass die Leute wissen, was behoben wird und wie.
Wenn sich Programmierer wild in die Codebasis hacken und Ideen ausprobieren, haben Sie keine Kontrolle darüber, was gerade passiert und ob es funktioniert.
quelle
Programmierer sind in der Regel schlau und kreativ (da dies die Grundvoraussetzung für eine gute Programmierung ist). Daher ist es immer gut, wenn sie eine Vielzahl von Ideen ausprobieren, um Probleme zu lösen. Es gibt jedoch zwei wichtige Dinge, die Sie beachten sollten, wenn Sie versuchen, die Leistung zu verbessern (ich gehe davon aus, dass Sie mit "Leistung" die Ausführungsgeschwindigkeit reduzieren):
Mein Hauptpunkt ist, dass es wichtig ist, dass Sie mit allen Beteiligten auf dem gleichen Stand sind, bevor Sie mit wilden Experimenten beginnen . Es ist immer eine Schande, später herauszufinden, dass Ihre weniger erfahrenen Mitarbeiter Dinge ausprobiert haben, die niemals funktionieren könnten (und das hätten Sie ihnen von vornherein sagen können).
quelle
Leider kann ich aus Erfahrung nicht sprechen. Aber ich habe gehört, dass Atlassian einen einzigen Tag hat, an dem es Mitarbeitern gestattet war, ihr eigenes Ding zu machen, was immer sie wollten, und ihre Ideen in einer Art Party-Atmosphäre zu präsentieren. Es stellte sich anscheinend als gut für sie heraus. Aber ich muss Andersen zustimmen und sagen, dass wenn es um Leistung geht, kreative und unkonventionelle Ideen weniger wichtig sind als die Profilerstellung, welche Prozesse die meiste Zeit in Anspruch nehmen. Vielleicht können Sie, nachdem Sie Ihr System profiliert haben, jedem einen Tag Zeit geben, um Ideen zu entwickeln, wie Sie wichtige Abschnitte des Prozesses beschleunigen können. Nachdem sie ihre Ideen präsentiert haben, können Sie auswählen, welche Sie ausprobieren möchten.
quelle
Eine erfolgreiche Übung, die wir in einigen meiner vorherigen Teams gemacht haben, war das Konzept von Deep Dives. Ein paar Leute versammelten sich in einem Konferenzraum, bestimmten ein Benutzerszenario und begannen einfach, entweder den Code durchzugehen oder sich die Profiler-Protokolle anzusehen. In einigen Fällen zeigten die Daten deutlich Engpässe, die es uns ermöglichten, Skeptiker davon zu überzeugen, dass es in ihrem eigenen Code wirklich Perfektionsprobleme gab! Um dies erfolgreich zu machen, haben wir einige wichtige Grundsätze befolgt:
Vermeiden Sie die Teilnahme des gesamten Teams an einem "Performance Push". Diese haben normalerweise nicht die Ergebnisse, die das Management aus den Gründen erwartet, die Thorbjørn Ravn Andersen in einer anderen Antwort erwähnt hat. In einigen Bereichen werden Sie große Gewinne erzielen, in anderen Gegenden, in denen die Menschen nicht vertraut sind, sind Regressionen zu verzeichnen, und es ist schwer vorherzusagen, wie viel Gewinn Sie erzielen sollten, wenn Sie sagen, dass Sie fertig sind. Das ist ein herausforderndes Gespräch mit dem Management.
quelle
Der Grund, warum Sie möglicherweise die Geschwindigkeit Ihrer Software verbessern müssen, liegt darin, dass etwas merklich langsam ist. Ist dies nicht der Fall, ist die Optimierung Zeitverschwendung. Aber wenn etwas langsam ist, dann mach die Aufgabe.
... und um die Aufgabe zu erledigen, gibt es zwei Schritte in dieser Reihenfolge:
Prüfen Sie, ob die Funktion, die die Aufgabe ausführt, effizient geschrieben ist. Hat es einen guten oder schlechten Algorithmus? Greifen Sie effizient auf eine Datenbank zu? Wird es 100-mal wiederholt, wenn es einmal möglich ist? Oft kann eine einfache Überprüfung des Codes das eine Hindernis finden und es nicht nur beheben, sondern Sie gleichzeitig zu einem besseren Programmierer machen.
Geben Sie nicht mehr als eine Stunde oder so für Nummer 1 aus. Wenn Sie das Problem in einer Stunde nicht finden können, verwenden Sie einen Profiler, um die betreffende Stelle zu finden. Sobald Sie den Problempunkt kennen, können Sie zu Nummer 1 zurückkehren und dies erneut tun. Suchen Sie nach dem besten Weg, um den von Ihnen identifizierten Code zu verbessern.
quelle
Im Allgemeinen (**) erzielen Sie durch Experimente keine bessere Leistung.
Du bekommst es durch
Wissen, wie man ein einfaches, effizientes Design erstellt. Wenn Sie diesen Teil falsch verstehen, macht das Experimentieren keinen großen Unterschied. Das Wissen, wie man bei der Verwendung eines Codegenerators erkennt, ist beispielsweise ein erfolgreicher Entwurfsansatz.
Wissen, wie man Software optimiert, indem man die Aktivitäten findet, die a) prozentual teuer und b) durch etwas Besseres ersetzbar sind. Jeder weiß, dass Sie "einen Profiler verwenden" sollten, aber das ist nicht genug.
Überprüfen Sie diese Antwort auf Ihre andere Frage.
** Ausnahmen sind möglicherweise stark hardwareabhängiger Code wie Grafik-Rendering, Prozessor-Pipeline oder CUDA-Verhalten oder das Experimentieren mit Netzwerk- oder DB-Protokollen, bei denen Sie sich nur mit der bestmöglichen Verwendung vertraut machen müssen.
ADDED: Es gibt etwas, das viele Programmierer großer Systeme für überraschend halten. In großen, perfekt konstruierten Programmen können große, unsichtbare Leistungsprobleme auftreten, die von Profilern nicht gefunden werden können, da sie nicht für Routinen lokalisiert sind. Sie sind Teil der allgemeinen Struktur des Programms, auch wenn das Programm im besten Stil durchgeführt werden kann.
Nur um ein konkretes Beispiel zu geben, hier ist ein Programm mit Quellcode (in C ++), das einen Job macht. Es ist aus einem echten C-Programm destilliert, an dem ich gearbeitet habe.
Es macht, was es wollte, aber welcher Bruchteil seiner Zeit ist nicht wirklich notwendig? Wie viel könnte es beschleunigt werden?
Nun, in der ersten Version des Programms dauerte etwas absolut vernünftig aussehendes und nicht lokal (für einen Profiler unsichtbar) 33,3% der Zeit. Wenn es ersetzt wurde, wurde diese Zeit gespeichert, und das war die zweite Version des Programms.
In der zweiten Version des Programms dauerte etwas anderes (für jeden Profiler unsichtbar), das entfernt werden konnte, 16,7% der Zeit. Das Entfernen führte zu Version 3.
In Version 3 wurden 13% entfernt. Von dem, was übrig war, wurden 66% entfernt. Von dem, was danach noch übrig war, wurden 61% entfernt!
Dann, endlich, von dem, was danach übrig war, wurden 98% entfernt!
Was ist das große Ganze? Wie viele der 1000 Zyklen des ursprünglichen Programms wurden entfernt? 998!
Jedes Programm ist anders, aber meines Erachtens hat jedes große Programm eine Reihe von zeitaufwändigen Problemen, die von Profilern nicht erkannt, manuell abgetastet und beseitigt werden können , wenn die Programmierer wirklich maximale Leistung wünschen für große Beschleunigungen.
quelle