Sie möchten eine Zeitspanne schaffen, in der jeder versuchen kann, Software schneller laufen zu lassen?


17

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:

( 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.)


Wenn Sie sagen, dass Sie die Leistung verbessern, sprechen Sie streng von einer Leistungs- / Benchmark-Perspektive, oder meinen Sie eine intuitivere Benutzeroberfläche, einen besseren Workflow usw., dh ein besseres Produkt?
Richard

Möglicherweise relevanter Tech Talk. Es werden die Versuche einiger Softwarefirmen erörtert, so etwas zu tun.
ProdigySim

Ich persönlich würde viele Leistungstests schreiben, die eindeutig zeigen, wie schnell oder langsam etwas als Funktion von etwas anderem ist.
Job

Antworten:


21

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.


6

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):

  • Algorithmische Optimierungen funktionieren in der Regel viel besser als alles andere. Als einfaches Beispiel: Was auch immer Sie mit Ihrer Bubblesort-Implementierung tun, bei ausreichender Anzahl wird eine extrem langsame Implementierung von Quicksort irgendwann schneller sein.
  • Es ist völlig unsinnig, alles zu tun, was mit der Leistung zu tun hat, es sei denn, Sie messen (profilieren) und stützen alles, was Sie tun, auf die Ergebnisse.

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).


1

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.


1

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:

  1. Konzentrieren Sie sich auf kritische Szenarien oder Codepfade, bei denen Engpässe vermutet werden. Verschwenden Sie keine Zeit damit, Dinge zu optimieren, die nicht optimiert werden müssen (wenn sie nicht kaputt sind ...)
  2. Halten Sie die Gruppe klein und konzentrieren Sie sich auf die Personen, die den Code am besten kennen. Vergessen Sie nicht, den Tester und den Programmmanager der Funktion mit einzubeziehen - sie haben wichtige Einblicke und können von der Teilnahme oder dem Sammeln von Informationen profitieren, damit sie besser testen können.
  3. Starten Sie die Sitzung, indem Sie vom Gebietseigner ein Blockschaltbild auf hoher Ebene und einen Überblick über das Gebiet erstellen lassen. Was sind die Schlüsselkomponenten und beschreiben kurz, was sie tun. Sie werden überrascht sein, wie oft das Blockdiagramm nicht die Realität widerspiegelte, als wir uns mit dem Code befassten. (Tatsächliches Zitat: "Ich wusste nicht, dass wir diese Komponente noch verwenden. Ich dachte, wir haben sie vor Jahren beseitigt!")
  4. Erwarten Sie, funktionale Fehler sowie Leistungsprobleme zu finden. Das ist gut. Erwarten Sie auch, dass Sie manchmal nichts Bedeutendes finden. Das kann auch gut sein.
  5. Erwarten Sie mehrere lange Sitzungen. Dies sind Arbeitstreffen. Machen Sie es sich bequem und arbeiten Sie daran. Sie können noch viel mehr tun, wenn Sie alle über längere Strecken zusammenarbeiten können.
  6. Machen Sie sich Notizen, gute Notizen. Wenn Sie eine Fehlerverfolgungsdatenbank verwenden, sollten Sie in Betracht ziehen, Probleme sofort zu öffnen, um den Überblick zu behalten, auch wenn sie eine niedrige Priorität haben.

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.


0

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:

  1. 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.

  2. 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.


0

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.


Um Ihre Antwort selbstständiger zu machen, möchten Sie möglicherweise näher erläutern, welche Elemente in den verschiedenen Versionen tatsächlich ersetzt wurden.

@ Thorbjørn: Es ist alles im Projekt und in der PDF-Diashow zusammengefasst, und wie gesagt, jedes Programm ist anders. Das einzige, was das gleiche ist, ist die Methode.
Mike Dunlavey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.