In den Tagen des modernen Computing - in typischen Geschäftsanwendungen - warum ist die Leistung wichtig? [geschlossen]


29

Dies mag für einige von Ihnen eine seltsame Frage sein.

Ich bin ein Hobby-Java-Programmierer. Ich habe mehrere Spiele entwickelt, ein AI-Programm, das Musik erstellt, ein anderes Programm zum Malen und ähnliches. Dies soll Ihnen sagen, dass ich Erfahrung in der Programmierung, aber nicht in der professionellen Entwicklung von Geschäftsanwendungen habe.

Auf dieser Website wird viel über Leistung gesprochen. Die Leute diskutieren oft, welcher Algorithmus in C # am effizientesten ist, um eine Aufgabe auszuführen, oder warum Python langsam und Java schneller ist usw.

Ich versuche zu verstehen, warum das wichtig ist.

In bestimmten Bereichen der Datenverarbeitung sehe ich, warum Leistung wichtig ist: Spiele, in denen Zehntausende von Berechnungen pro Sekunde in einer Schleife mit ständigen Aktualisierungen durchgeführt werden, oder Systeme auf niedriger Ebene, auf die andere Programme angewiesen sind, z. B. Betriebssysteme und VMs usw.

Warum ist für die normale, typische High-Level-Business-App die Leistung wichtig?

Ich kann verstehen, warum es vor Jahrzehnten wichtig war. Computer waren viel langsamer und hatten viel weniger Speicher, daher musste man sich diese Dinge genau überlegen.

Aber heute haben wir so viel Speicherplatz und Computer sind so schnell: Ist es tatsächlich wichtig, ob ein bestimmter Java-Algorithmus O (n ^ 2) ist? Wird es für die Endbenutzer dieser typischen Geschäftsanwendung tatsächlich einen Unterschied machen?

Wenn Sie in einer typischen Geschäftsanwendung eine GUI-Taste drücken und hinter den Kulissen einen O (n ^ 2) -Algorithmus aufrufen, spüren Sie in diesen Tagen der modernen Datenverarbeitung tatsächlich die Ineffizienz?

Meine Frage ist zweigeteilt:

  1. In der Praxis spielt die Leistung heute in einem typischen normalen Geschäftsprogramm eine Rolle?
  2. Wenn dies der Fall ist, geben Sie mir bitte Beispiele aus der Praxis für Bereiche in einer solchen Anwendung, in denen Leistung und Optimierung wichtig sind.


Leistung ist wichtig, wenn es schlecht ist.
Mike Dunlavey

Antworten:


40

Sie haben Recht, die Leistung in Geschäftsanwendungen ist kein wirklich wichtiges Thema, wie es von den meisten Programmierern diskutiert wird . In der Regel treten bei leistungsbezogenen Diskussionen, die ich von Programmierern höre, verschiedene Probleme auf:

  • Sie sind meist vorzeitige Optimierung . Normalerweise möchte jemand "den schnellsten Weg", um eine Operation ohne ersichtlichen Grund auszuführen, und nimmt am Ende entweder Codeänderungen vor, die von den meisten Compilern sowieso vorgenommen werden (z. B. das Ersetzen der Division durch Multiplikation oder das Inlinen einer Methode), oder er verbringt Tage damit, Änderungen vorzunehmen Dies wird dazu beitragen, einige Mikrosekunden zur Laufzeit zu gewinnen.

  • Sie sind oft spekulativ . Ich bin froh zu sehen, dass bei Stack Overflow und Programmers.SE die Profilerstellung häufig erwähnt wird, wenn es um die Leistung geht, aber ich bin auch enttäuscht, wenn ich zwei Programmierer sehe, die nicht wissen, welche Profilerstellungen über die Leistung sprechen. damit verbundene Änderungen, die sie in ihrem Code vornehmen sollten. Sie glauben, dass die Änderungen alles schneller machen werden, aber praktisch jedes Mal wird es entweder keine sichtbaren Auswirkungen haben oder die Dinge verlangsamen, während ein Profiler sie auf einen anderen Teil des Codes verwiesen hätte, der leicht optimiert werden kann und der 80% verschwendet. der ganzen Zeit.

  • Sie konzentrieren sich nur auf technische Aspekte. Bei der Leistung benutzerorientierter Anwendungen geht es um das Gefühl: Fühlt es sich schnell und reaktionsschnell an oder fühlt es sich langsam und klobig an? In diesem Zusammenhang werden Leistungsprobleme in der Regel von Designern der Benutzererfahrung viel besser gelöst: Ein einfacher animierter Übergang kann häufig den Unterschied zwischen einer App, die sich furchtbar langsam anfühlt, und der App, die sich reaktionsschnell anfühlt, während beide 600 ms benötigen. die Operation durchführen.

  • Sie basieren auf subjektiven Elementen, auch wenn sie mit technischen Einschränkungen zusammenhängen. Wenn es nicht darum geht, sich schnell und reaktionsschnell zu fühlen , sollte es eine nicht funktionierende Anforderung geben, die angibt, wie schnell eine Operation mit bestimmten Daten ausgeführt werden soll, die auf einem bestimmten System ausgeführt werden . In Wirklichkeit geschieht es wie folgt aus: der Manager sagt , dass er findet etwas langsam, und dann müssen Entwickler , um herauszufinden , was das heißen. Ist es langsam wie in "es sollte unter 30 ms sein, während es derzeit zehn Sekunden verschwendet" oder langsam wie "wir können die Dauer vielleicht von zehn auf neun Sekunden verringern"?

Zu Beginn meiner Karriere als Programmierer arbeitete ich für einige meiner Kunden an einer Software. Ich war überzeugt, dass diese Software die nächste großartige Sache ist, die der Welt Freude bereiten wird, daher war ich offensichtlich besorgt über die Leistung.

Ich habe Begriffe wie "Profiling" oder "Benchmark" gehört, aber ich wusste nicht, was sie bedeuten, und es war mir auch egal. Außerdem war ich zu konzentriert, als ich das Buch über C las, insbesondere das Kapitel, in dem Optimierungstechniken besprochen wurden. Als ich entdeckte, dass Computer die Multiplikation schneller ausführen als die Division, ersetzte ich die Division durch die Multiplikation, wo immer ich konnte. Als ich feststellte, dass das Aufrufen einer Methode langsam sein kann, kombinierte ich so viele Methoden wie möglich, als wären die vorherigen 100 LOC-Methoden noch kein Problem.

Manchmal habe ich Nächte damit verbracht, Änderungen vorzunehmen, die, wie ich überzeugt war, den Unterschied zwischen einer langsamen App, die niemand haben möchte, und einer schnellen App, die jeder herunterladen und verwenden möchte. Die Tatsache, dass zwei echte Kunden, die an dieser App interessiert waren, aktuelle Funktionen anfragten, störte mich nicht: "Wer würde eine Funktion wünschen, wenn die App langsam ist?" - dachte ich.

Schließlich verwendeten die beiden einzigen Kunden die App nicht mehr. Trotz all meiner Bemühungen war es nicht erstaunlich schnell, vor allem, weil etwas nicht stimmt, wenn Sie nicht wissen, was Indizes sind und Ihre App datenbankintensiv ist. Wie auch immer, wenn ich nur eine weitere erfolgsabhängige Veränderung zu tun, die von einigen Mikrosekunden die Ausführung von Code zu verbessern wurde die einmal pro Monat verwendet wird, die Kunden nicht sehen Änderungen. Was sie sahen, ist, dass die Benutzererfahrung schrecklich ist, Dokumentation fehlt, wichtige Funktionen, die sie seit Monaten anfragten, nicht verfügbar waren und die Anzahl der zu lösenden Fehler stetig zunahm.

Ergebnis: Ich hatte gehofft, dass diese App von Tausenden von Unternehmen auf der ganzen Welt verwendet wird, aber heute finden Sie im Internet keine Informationen zu dieser Anwendung. Die beiden einzigen Kunden gaben es auf, und das Projekt wurde ebenfalls aufgegeben. Es wurde nie vermarktet, nie öffentlich beworben, und heute bin ich mir nicht einmal sicher, ob ich es auf meinem PC kompilieren kann (noch die Originalquellen finden kann). Das wäre nicht passiert, wenn ich mich mehr auf Dinge konzentriert hätte, die wirklich wichtig sind.

Vor diesem Hintergrund ist die Leistung im Allgemeinen wichtig :

  • In nicht-geschäftlichen Apps kann dies von entscheidender Bedeutung sein. Es gibt eingebettete Software , Software, die auf Servern ausgeführt wird (wenn Sie einige Tausend Anfragen pro Sekunde haben, was nicht so groß ist, beginnt die Leistung ein Problem zu sein), Software, die auf Smartphones ausgeführt wird , Videospiele , Software für Profis (versuchen Sie, damit umzugehen eine 50-GB-Datei in Photoshop auf einem nicht sehr schnell zu überzeugenden Computer) und sogar gewöhnliche Softwareprodukte, die an viele Leute verkauft werden (wenn Microsoft Word die doppelte Zeit für jeden Vorgang verwendet, wird die verlorene Zeit mit der Zahl multipliziert der Benutzer wird ein Problem).

  • In Business - Anwendungen gibt es viele Fälle , in denen eine Anwendung , die fühlt und ist wird sich nur langsam von den Benutzern selbst gehasst werden. Sie wollen das nicht, indem Sie Ihre Bedenken zur Geltung bringen.


4
Tolle Antwort, vor allem, weil der Fokus auf sinnlose Leistungsdiskussionen und sinnlose Optimierungen gelegt wird.
Doc Brown

1
a simple animated transition may often be the difference between an app which feels terribly slow and the app which feels responsive- obwohl diese auf jeden Fall sparsam verwendet werden sollten, können Apps, die Animationen und Übergänge überall verstreuen, frustrierend sein, wenn man diese Übergänge täglich ansieht!
Cosmic Ossifrage

Was ist die Quelle Ihres Zitats?
Adam Johns

1
@ AdamJohns: keine Quelle. Es ist aus den Entwürfen meiner eigenen Artikel zitiert, die noch nicht in meinem Blog veröffentlicht sind.
Arseni Mourzenko

@MainMa Oh, großartig. Ich habe diese kleine Illustration Ihres Punktes wirklich genossen.
Adam Johns

44

Ja. Ja tut es. Die Laufzeitgeschwindigkeit ist nicht die einzige Sorge, die Sie haben sollten, und sie ist nicht so dringend wie 1982 oder immer noch auf Embedded-Systemen mit niedriger Leistung, aber es ist immer eine Sorge, und es ist wichtig, dass Sie verstehen warum das so ist.

Zum einen beschreibt die von Ihnen erwähnte asymptotische Komplexität das Verhalten eines Programms mit zunehmender Eingabegröße . Ein nichtlineares Programm, das sich mit 10 Elementen befasst, kann sich mit überflüssiger Arbeit abfinden, aber es wird Sie beißen, wenn Sie sich eines Tages mit 1000 befassen müssen, weil es nicht nur langsamer, sondern viel, viel langsamer zu sein scheint . Und Sie wissen nicht (ohne umfassende Analyse und Benchmarking), ob dieser Punkt bei 100 Artikeln, bei 1000 Artikeln oder erst bei 100.000 Artikeln liegt. Es mag schwer zu glauben sein, aber die Auswahl des besten Algorithmus ist in der Tat viel einfacher, als diesen Punkt für jede Routine abzuschätzen und Ihre Implementierung in Abhängigkeit von dieser Schätzung auszuwählen.

Lesen Sie auch die Grundlagen der Benutzererfahrung. Es gibt gut erforschte Schwellenwerte, die bestimmen, wie die Interaktion mit einem Programm in Abhängigkeit von seinen Reaktionszeiten (10 ms, 100 ms, einige Sekunden usw.) wahrgenommen wird. Crossing eine dieser Schwellen verursachen Benutzer auszurücken aus Ihrer Anwendung, und wenn Sie in der glücklichen Lage des Schreibens Monopol - Software sind , dass die Menschen haben zu verwenden, außer Eingriff Benutzer sich direkt in negativer Geschäftswert , weil es zu einem Verlust der Kunden führt.

Dies sind nur einige der Gründe , warum ein professioneller Programmierer muss über algorithmische Komplexität kennen und damit umgehen verantwortungsvoll . Heutzutage ist es normalerweise nicht mehr erforderlich, einen speziell optimierten, schlecht lesbaren Code für irgendetwas zu programmieren, es sei denn, es handelt sich um eine zeitkritische innere Schleife. Sie sollten jedoch niemals eine Komplexitätsklasse aufrufen, die höher ist als offensichtlich erforderlich den Job erledigen.


2
Eine andere Sache, die Sie bei der Wahl des Algorithmus berücksichtigen sollten: Aufgrund von Bibliotheken und Abstraktionen wurden bereits viele Algo-Entscheidungen für Sie oder zumindest "unter der Haube" getroffen. Sie sollten immer noch die Auswirkungen auf die Leistung kennen. Und diese Leistung spielt eine Rolle .
Joshin4colours

14

Ja tut es!

Da Sie nach Beispielen gefragt haben, fallen Ihnen mehrere alltägliche Situationen ein:

  1. Umgang mit Big Data : Viele Geschäftsanwendungen werden von Datenbanken unterstützt, und in vielen Fällen fließen diese Datenbanken über mit Daten. Und da der Speicherplatz auf der Festplatte günstig ist, sind die Mengen der aufgezeichneten und gespeicherten Daten verrückt. Erst letzte Woche hat sich ein Kunde darüber beschwert, dass seine Anwendung so langsam ist, wenn nur einige durchschnittliche Zahlen angezeigt werden (Abfragen über einige Millionen Zeilen ...) - Auch im alltäglichen Gebrauch haben wir Batch-Daten-Konvertierungen und Berechnungen mit Laufzeiten in der Liga von mehreren Std. Letztes Jahr hat eine algorithmische Optimierung die Prozesszeit einer Charge von 8 auf 4 Stunden gesenkt, jetzt kollidiert sie nicht mehr mit der Tagesschicht!

  2. Reaktionsfähigkeit : Es gab Usability-Studien (wenn ich Zeit habe, werde ich Links zu den relevanten Fragen auf ux.se hinzufügen ...), die zeigen, dass die Benutzerzufriedenheit in hohem Maße mit der Reaktionsfähigkeit zusammenhängt. Ein Unterschied in der Reaktionszeit von 200 ms gegenüber 400 ms kann Sie leicht einen großen Prozentsatz Ihrer Kunden kosten, der Sie für Ihre Konkurrenten übrig lässt.

  3. Eingebettete Systeme : Computer werden nicht schneller, sie werden langsamer und kleiner ^ _ ^ Die mobile Entwicklung hat enorme Auswirkungen auf die Anwendungsentwicklung. Sicher können wir Speicher- und CPU-Zyklen wie Jelly Beans auf modernen Desktop-Computern umgehen, aber jetzt bittet Ihr Chef Sie, den Algorithmus zur Schlafanalyse auf einer verdammten Uhr oder auf einer SIM-Karte zu implementieren ...


4

In der Praxis spielt die Leistung heute in einem typischen normalen Geschäftsprogramm eine Rolle?

Ich weiß nicht, was ein typisches normales Geschäftsprogramm ist. Was ich weiß, ist, dass Benutzer unsere Programme immer mit viel mehr Daten füttern, als wir geplant hatten (oft nachdem sie gefragt haben, wie groß sie sein würden und eine Sicherheitsmarge hinzugefügt haben) und in diesem Fall eine lineare Zunahme von erwarten zur Laufzeit, akzeptieren Sie ein Protokoll-n-Verhalten und beschweren Sie sich, dass die Anwendung einfriert, wenn etwas anderes passiert. Und sie neigen dazu, die Größe des Ergebnisses stärker zu berücksichtigen als die Größe der Eingabe, mit Ausnahme des Falls, dass aus ihrem POV hervorgeht, dass alle Eingabedaten verarbeitet werden müssen.

Also ja, Leistung, zumindest auf der Komplexitätsebene, ist von Bedeutung. Die Mikrooptimierung innerhalb einer Komplexitätsklasse spielt keine Rolle, es sei denn, Sie sind sichtbar schlechter als die Konkurrenz (entweder bei Benchmarks in einigen Märkten oder nach reiner Wahrnehmung). Der Klassenwechsel erfolgt in der Folge "augenblicklich", "nicht augenblicklich", der Benutzer jedoch nicht nicht zu etwas anderem wechseln "," langsam genug, dass der Benutzer zu etwas anderem wechselt, wenn die Gefahr besteht, dass der Aktionsfluss unterbrochen wird "," langsam genug, dass der Benutzer die Aufgabe startet und dann von Zeit zu Zeit prüft "," langsam genug dass der Benutzer plant, die Aufgabe über Mittag, über Nacht, über das Wochenende zu starten ").


4

In modernen Geschäftsanwendungen liegen die Leistungsprobleme nicht in einem Mangel an CPU oder Arbeitsspeicher. Sie treten jedoch in Form von Netzwerklatenzen, E / A-Leistung und Abstraktionen auf, die all diese Faktoren verbergen. Es kommt darauf an, wie gut das Design ist und wie erfahren die Entwickler sind. Selbst eine einfache CRUD-Anwendung kann angehalten werden, wenn sie zeilenweise aus der Datenbank abruft, anstatt eine Abfrage auszuführen (auch als N + 1-Problem bekannt).

Das Problem ist, dass gutes Design und erfahrene Entwickler teuer sind. Und es ist in der Regel viel billiger, irritierte Benutzer zu haben, als in tatsächliche Leistungsoptimierungen zu investieren. Es gibt einige Fälle, in denen Kunden eine hohe Leistung benötigen (z. B. Webbrowser), die jedoch nur selten für gängige Geschäftsanwendungen gelten.


3

Denken Sie daran, dass bei serverbasierten Anwendungen möglicherweise Hunderte, Tausende oder sogar Millionen Benutzer gleichzeitig versuchen, Dinge zu tun. Eine geringe Einsparung an Effizienz in einer solchen Situation kann sich erheblich auf den Hardwarebedarf für Serviceanfragen auswirken.


5
Tatsächlich werden die meisten konstanten Faktoren besser gelöst, indem mehr Hardware auf das Problem angewendet wird, da in der Regel mehr Hardware billiger ist als mehr Zeit für die Optimierung der Sache. Das Problem ist schlechtes asymptotisches (Skalierungs-) Verhalten, da das Werfen von mehr Hardware nicht viel hilft.
Jan Hudec

3
Sie optimieren nur einmal, zahlen aber monatlich die Stromrechnung.
Jaydee

2
@JanHudec: Ich verstehe nicht so recht, wie man das mit einem ehrlichen Gesicht sagen kann, wenn die Website, auf der Sie sich gerade befinden (unser lieber Stack Exchange), monatlich 560 Millionen Seitenaufrufe auf nur 25 Servern weltweit ausführt .
Mehrdad

2
@Mehrdad: Und sie hätten es stattdessen in C schreiben und es vielleicht auf 20 statt auf 25 Servern laufen lassen können. Aber sie taten es nicht, weil die Einsparung die erhöhte Entwicklungszeit nicht aufwiegen würde. Viele Web-Services sind in Python und PHP implementiert, einige der langsamsten Sprachen, die im Allgemeinen verwendet werden. Niemand denkt jedoch daran, sie schneller umzuschreiben, da sich die verlängerte Entwicklungszeit nicht auszahlen würde. Konstante Faktoren werden meistens gelöst, indem einfach mehr Hardware darauf geworfen wird. Skalierungsprobleme (asymptotische Probleme) sind eine andere Selbstverständlichkeit.
Jan Hudec

3
... und um ehrlich zu sein, die Datenbank, die den größten Teil der Grunzarbeit leistet, wurde so geschrieben und optimiert, dass sie schnell arbeitet.
Blrfl

3

Es ist sicherlich sehr wichtig.

Das Hauptproblem ist nicht einmal für den Benutzer lästig zu sein, wie unnötige Verzögerungen auftreten , wenn GUI - Elemente sind overdrawn zweimal oder dreimal (was tut auf integrierte Grafik Angelegenheit!) Oder einfach , weil das Programm so lange dauert zu tun ... es was auch immer tut (meistens uninteressantes Zeug). Obwohl das natürlich auch ein Thema ist.

Es gibt drei wichtige Missverständnisse:

  1. Die meisten typischen Business-Computer sind nicht "so viel leistungsfähiger" . Der typische Business-Computer ist kein 8-Core-i7 mit einer umwerfenden Grafikkarte und 16 GB RAM. Es handelt sich um ein Notebook mit einem mobilen Prozessor der Mittelklasse, integrierter Grafik, 2 GB Hauptspeicher (4 GB, wenn Sie Glück haben), einer 5400 U / min-Festplatte und einer Unternehmensversion von Windows mit einer Vielzahl von Echtzeit-Antiviren- und Richtliniendurchsetzungssoftware Hintergrund. Oder für die meisten Berater ist der "Computer" einfach das iPhone ...
  2. Die meisten "typischen Geschäftsbenutzer" sind keine Techniker, sie verstehen die Auswirkungen der Erstellung einer Tabelle mit 10-12 Querverweisregistern, 150 Spalten und 30.000 Zeilen nicht (diese Zahlen sind nicht so unrealistisch, wie Sie vielleicht annehmen!) Und sie will es auch nicht wissen. Sie werden es einfach tun.
  3. Ein zweiter Verlust, der nicht kostet, ist eine völlig falsche Annahme.

Meine Frau arbeitet am oberen Ende eines solchen "typischen Geschäftsumfelds". Der Computer, den sie benutzt, kostet ungefähr 3,5 Stunden ihrer Arbeitszeit. Das Starten von Microsoft Outlook dauert an einem guten Tag ungefähr 3 Minuten, bis es fertig ist (6-8 Minuten am Quartalsende, wenn die Server stark ausgelastet sind). Einige dieser 30k-Zeilen-Tabellen benötigen 2-3 Sekunden, um einen Wert zu aktualisieren, bei dem der Computer "eingefroren" ist (ganz zu schweigen davon, wie lange Excel benötigt, um sie zu starten und zu öffnen!). Noch schlimmer ist es, wenn Sie den Desktop freigeben. Bring mich nicht mal auf SAP.
Es ist sicher wichtig, ob hunderttausend Menschen pro Arbeitstag 20-25 Minuten verlieren und auf nichts warten. Das sind Millionen verlorenwas Sie, anstatt sie zu verlieren, als Dividenden auszahlen könnten (oder höhere Löhne zahlen).
Sicher, die meisten Angestellten sind am unteren Ende der Gehaltsskala, aber auch am unteren Ende ist Zeit Geld .


3

Ich kann verstehen, warum es vor Jahrzehnten wichtig war. Computer waren viel langsamer und hatten viel weniger Speicher, daher musste man sich diese Dinge genau überlegen.

Sie scheinen zu unterschätzen, wie schnell N ^ 2 wächst. Nehmen wir an, wir haben einen Computer und unser N ^ 2-Algorithmus benötigt 10 Sekunden, wenn N = 10. Nach Ablauf der Zeit haben wir einen neuen Prozessor, der 6-mal schneller ist als unser Original, sodass unsere 10-Sekunden-Berechnung jetzt weniger als zwei Sekunden beträgt. Wie viel größer kann N sein und trotzdem in diese ursprüngliche Laufzeit von 10 Sekunden passen? Wir können jetzt 24 Artikel bearbeiten, etwas mehr als doppelt so viel. Wie viel schneller müsste unser System sein, um zehnmal so viele Artikel zu bearbeiten? Nun, es müsste 100-mal schneller sein. Daten wachsen ziemlich schnell und machen den Fortschritt der Computerhardware für N ^ 2-Algorithmen zunichte.


Ein weiteres Beispiel: Wenn die Verarbeitung eines Elements 30 CPU-Zyklen oder 10 ns dauert (was recht günstig ist), dauert der Algorithmus bereits eine volle Sekunde, wenn Sie nur 10000 Elemente haben. 10000 Elemente sind in vielen Zusammenhängen nicht viel.
CodesInChaos

1

Sie werden es kaum glauben, wie viele Business-Programme von Drittanbietern wir bei der Arbeit verwenden, und viele von ihnen sind im Vergleich zu meinen persönlichen Standards nur lächerlich langsam zu bedienen. Wenn die Programme etwas wären, das ich zu Hause verwende, hätte ich sie vor langer Zeit durch ein alternatives ersetzt.

In einigen Fällen fließt der Unterschied direkt in die Kosten ein, da einige Programme direkt die Anzahl der Aufgaben beeinflussen, die ich am Tag ausführen kann, und somit meine Produktivität und die Anzahl der abrechenbaren Artikel verringern. Daher würde ich sagen, dass es auch für Business-Programme sehr wichtig ist, mindestens so leistungsfähig zu sein, dass sie nicht die einkommensbeschränkende Rolle spielen.

Ein Beispiel ist das Incident Management, bei dem die Arbeit in 15-Minuten-Intervallen gemessen wird (Service Desk). Wenn das Programm langsam genug ist, um ein Ticket für mehr als 15 Minuten (einschließlich der eigentlichen Arbeit) zu pushen, wird es den Prozess erheblich verlangsamen. Eine Ursache könnte ein langsamer Datenbankzugriff sein, der einfach "eine Weile wartet", wann immer der Benutzer eine Aktion ausführt (Auflösungsdetails ausfüllen, Arbeitsinformationen aktualisieren oder ähnliches). Ich kann mir vorstellen, dass es Fälle gibt, in denen langsame Programme sogar kritischere Dinge beeinflussen können, z. B. Angaben zum Krankenhauspatienten zu dringenden Vergiftungsfällen - möglicherweise Arzneimittelallergien oder Ähnliches?


1

Viele der anderen Antworten behandeln das Thema sehr gründlich, weshalb ich mich auf die Gründe und Gründe beschränke. Stattdessen möchte ich ein reales Beispiel geben, um zu zeigen, wie eine algorithmische Auswahl reale Auswirkungen haben kann.

http://windowsitpro.com/windows-xp/svchost-and-windows-update-windows-xp-still-problem

Der verlinkte Artikel beschreibt einen Fehler im Algorithmus zur Berechnung von Windows XP-Updates. Für den größten Teil der Lebensdauer von Windows XP hat der Aktualisierungsalgorithmus problemlos funktioniert. Der Algorithmus berechnet, ob ein Patch durch einen neueren Patch ersetzt wurde und daher nicht installiert werden muss. Gegen Ende wurde die Liste der ersetzten Updates jedoch sehr lang *.

Der Aktualisierungsalgorithmus war exponentiell. Die Berechnung jedes neuen Updates dauerte doppelt so lange wie das vorherige ( ). Als die Listen in den Bereich von 40 Updates (* lang ) gelangten, dauerte es bei voller Kapazität bis zu 15 Minuten, um nach Updates zu suchen. Dadurch wurden während des Updates viele XP-Computer gesperrt. Schlimmer noch, wenn man die Updates installieren würde, würde der Algorithmus erneut ausgeführt und weitere 15 Minuten dauern. Da auf vielen Computern automatische Updates eingestellt waren, konnten die Computer bei jedem Systemstart für 15 Minuten gesperrt werden und möglicherweise in bestimmten Abständen erneut.O(n) = 2n

Microsoft hat sowohl kurzfristige Hacks (Entfernen von Elementen aus der Update-Liste) als auch langfristige Fixes verwendet, um dieses Problem zu beheben. Dies war wichtig, da die neuesten Windows-Versionen denselben Algorithmus verwendeten und möglicherweise eines Tages mit demselben Problem konfrontiert waren.

Hier können wir sehen, dass die Wahl eines Algorithmus echte Auswirkungen hatte. Der falsche Algorithmus ist zwar für den größten Teil der Lebensdauer des Produkts in Ordnung, kann sich jedoch auf die Zukunft negativ auswirken.


0

Ich denke, Sie interpretieren die Menge der Fragen zur Leistung als Hinweis darauf, dass die Leistungsanforderungen für Geschäftsanwendungen wichtig sind, anstatt zu erkennen, dass es schwierig ist , die Leistung zu verbessern . Sie können es einfach zum Laufen bringen, indem Sie Brute-Force-Techniken ausprobieren oder Beispielcode kopieren und einfügen.

Jeder kann Glück haben und Änderungen vornehmen, bis etwas schneller läuft, aber das funktioniert selten. Aufgrund mangelnder Erfahrung können Entwickler externe Hilfe in Anspruch nehmen. In einigen Umgebungen stellen Leistungsverbesserungen ein einzigartiges Problem dar. Daher ist es möglicherweise die einzige Option, eine bestimmte Frage auf einer Site wie StackOverflow zu stellen. Außerdem verdienen viele Berater ihr Geld, indem sie in der Lage sind, diese Art von Problemen zu lösen.


-1

Es hängt stark davon ab, wie Sie "gute Leistung" definieren. Ihre Algorithmen sollten immer die bestmögliche Komplexität verwenden. Missbrauche Schlupflöcher, um deinen durchschnittlichen Käfig zu beschleunigen. Buffer und Preload / Precompile wo immer möglich in einem interaktiven Programm.

Es gibt eine andere Definition für "gute Leistung": Optimieren der Konstanten Ihrer Komplexitätsklasse. Hier bekommt C ++ seinen Titel, wo die Leute anfangen, Java langsam zu nennen, wo 5% weniger Laufzeit das Allerheiligste zu sein scheint. Mit dieser Definition haben Sie recht. Computerhardware wird mit der Zeit immer komplizierter, während Compiler immer besser werden. Irgendwann kann man Low-End-Code nicht besser optimieren als den Compiler - also lass es einfach sein und konzentriere dich auf deine Algorithmen.

Zu diesem Zeitpunkt wird die Verwendung von Java / Haskell / C ++ nur eine weitere Entwurfsentscheidung. Die Zahleneingabe kann über OpenCL auf Ihrer GPU erfolgen. Benutzeroberflächen benötigen konstante Zeitalgorithmen und sind gut. Die Ausgabe und Modularität ist wichtiger als das Ausrichten der Klassen, um eine um 20% bessere Cache-Auslastung zu erzielen. Multithreading wird wichtig, weil die Leute keine schnelle, sondern eine reaktionsschnelle App wollen. Was nicht wichtig ist, ist, dass Ihre App ständig 10% langsamer ist, als es sein könnte. Selbst 50% sind in Ordnung (aber die Leute fangen dann an, Fragen zu stellen). Konzentrieren Sie sich auf Korrektheit, Reaktionsfähigkeit und Modularität.

Ich liebe es, in Haskell oder zumindest in funktionaler Form (sogar in C ++) zu programmieren. Es ist viel wichtiger, Tests für Ihr gesamtes Programm einfach schreiben zu können, als bei Batch-Jobs etwas schneller zu sein.


-1

Ganz einfach: Kosten

Mein früherer Arbeitgeber verfügte über ein Lernmanagementsystem, das als SaaS-Modell auf physischen Servern gehostet wurde. Der Heap der JVM wurde für die älteren Maschinen auf 2 GB und für die neueren Maschinen auf 3 GB konfiguriert, und wir haben mehrere Instanzen pro Maschine ausgeführt. Sie würden denken, das wäre genug.

Bevor ich anfing, gab es ein Leistungsteam, das dafür verantwortlich war, dass das System ansprechbar und skalierbar war. Sie stellten fest, dass es bestimmte Daten gab, die wir ständig aus der Datenbank abfragten. Es gab eine Tabelle, an der wir uns sogar den meisten Abfragen angeschlossen haben, um eine Spalte abzurufen. Diese Daten haben sich selten geändert.

Das Problem ist, wir hatten 2 GB zu arbeiten. Die naheliegende Lösung besteht also darin, alle häufig gelesenen Daten zwischenzuspeichern. Dann hatten wir Gedächtnisprobleme, angefangen kurz bevor ich an Bord kam.

Dazu gab es zwei Denkrichtungen:

  1. Speicher und Hardware sind heutzutage im Allgemeinen billig. Kaufen Sie einfach mehr RAM, damit Sie mehr cachen können.
  2. Warum benötigt ein Learning Management System mehr als 3 GB RAM? Es werden lediglich SQL-Abfragen ausgegeben, Weiterleitungen zum Starten von Kursen gesendet und die Fortschritte der Schüler anhand von Kursen bewertet.

Das zweite Argument hat sich durchgesetzt und ich habe über ein Jahr damit verbracht, die Speichernutzung zu optimieren.

Mein jetziger Arbeitgeber hostet ebenfalls ein Learning-Management-System, das jedoch etwas anders gehostet wird. Die Skalierbarkeit ist so schlecht, dass eine einzelne Installation (aufgeteilt auf 4 virtuelle Server mit Lastenausgleich) nur 80 Kunden bedienen kann. Einige unserer größeren Kunden erhalten sogar ihre eigenen Server. Die meisten Probleme, die dazu führen, sind Leistungsprobleme, z. B. SQL-Abfragen, die alle CPU-Zyklen blockieren, Speicherverluste und redundanten Code, der dasselbe mehrmals ausführt. Wir haben sogar eine firmeninterne App entwickelt, deren einziger Zweck darin besteht, Server neu zu starten, wenn sie keine schlechte Leistung erbringen. Es gibt einen Mitarbeiter, der dieses Tool verwaltet (zusammen mit anderen Verantwortlichkeiten).

Sie haben die erste Denkschule abonniert, die ich oben erwähnt habe: Wirf mehr Hardware darauf, weil die Hardwarekosten billiger sind als die Entwicklergehälter.

Dies verlief nicht so wirtschaftlich wie erwartet. Zwischen Hardware-, Softwarelizenzierungs- und Support-Mitarbeitern, die sich um die Server kümmern, haben wir jedes Jahr Millionen ausgegeben , um zu vermeiden, dass ein Entwickler Zeit für die Erstellung von Profilen benötigt.

Bei meinem Beitritt wurde ich für die Behebung unserer Verfügbarkeitsprobleme verantwortlich gemacht. Da die meisten unserer Verfügbarkeitsprobleme auf eine schlechte Leistung zurückzuführen sind, habe ich unseren Code auf Leistung optimiert und die Skalierbarkeit wurde erheblich verbessert, wobei die Verfügbarkeit erheblich verbessert wurde. Wir sind bereit, die Dichte zu erhöhen. Unnötig zu erwähnen, dass mein Gehalt nicht annähernd eine Million beträgt (ich wünschte es!). Wenn Sie also Geld dafür ausgeben, dass ich die Leistung des Codes verbessere, werden Sie uns Millionen pro Jahr ersparen.

TL; DR

Wenn Sie eine gründliche Kosten-Nutzen-Analyse durchführen, werden Sie feststellen, dass es billiger ist, nur den Code zu korrigieren. Ein bekanntes Leistungsproblem, das Sie ignorieren, wird zu einer technischen Verschuldung .


1
Nicht jede Kosten-Nutzen-Analyse führt zur "Korrektur des Codes". Programmierer sind sehr teuer, und wenn Sie RAM für weniger als die Kosten eines Programmierers hinzufügen und immer noch das Problem beheben können ...
Robert Harvey

Es ist schön, dass Sie bei so vielen Cloud-Hosting-Situationen sehen können, wie viel Sie tatsächlich für Strom bezahlen. Zum Beispiel verwenden wir Amazon RDS für die Datenbank. Der Unterschied zwischen der größten und der zweitgrößten Instanz beträgt ca. 3500 US-Dollar pro Jahr. Das ist eine Zahl, die Sie sich ansehen und beurteilen können, ob die Optimierung viel Zeit für Programmierer wert ist oder nicht.
Carson63000

@RobertHarvey Stimmt, ich hätte kein absolutes daraus machen sollen. Was ich damit sagen wollte war, dass die absolute "Hardware ist billiger als Entwicklungszeit" nicht absolut wahr ist, aber Sie haben Recht, es könnte manchmal wahr sein.
Brandon

-2

Ich habe Ihre Frage so verstanden: Um genügend gute Leistungen zu erzielen (dh die Benutzer sind zufrieden und mein Backend schreckt nicht zurück), muss ich die Theorie zur algorithmischen Komplexität verstehen?

Es kommt darauf an, was Sie mit "typischer" Geschäftsanwendung meinen. In vielen Fällen, insbesondere bei einfachen CRUD-ähnlichen Informationssystemen, lautet die Antwort nein. Für diese müssen Sie "einfach" (manchmal ist es tatsächlich schwierig) die Leistungsengpässe nachverfolgen können: Habe ich einen Index in meiner Datenbank verpasst? Sende ich zu viele Daten über das Netzwerk? Habe ich eine 1000-Dollar-Uhr in meinem angle.js-Frontend? Hier geht es darum, eine solide Architektur aufzubauen, Ihren Technologiestack genau zu kennen und Unsinn zu vermeiden. Das können Sie erreichen, wenn Sie ein guter Handwerker sind, nicht unbedingt ein Informatiker. Eine andere Art zu sagen ist, dass die Leute, die das Oracle-Abfrageoptimierungsprogramm erstellt haben, sich mit der algorithmischen Komplexität befassten. Sie müssen nur richtig verwenden, was sie Ihnen zur Verfügung gestellt haben.

Jetzt gibt es Ausnahmen. Wenn es um Big Data oder maschinelles Lernen geht, müssen Sie wissen, was Sie tun, und nicht nur die Standardalgorithmen verwenden, die Ihnen zur Verfügung stehen. Selbst im Front-End-Bereich können beim Erstellen erweiterter Datenvisualisierungen einige mit nicht linearen Komplexitätskosten verbunden sein (z. B. Force-Layout-Diagramme).

Heutzutage werden diese Ausnahmen immer häufiger und der Markt ist ziemlich trocken, wenn man nach Leuten sucht, die damit umgehen können. Also: Ja, Sie können ohne Informatik-Hintergrund erfolgreich sein, aber mit einigen sind Sie noch erfolgreicher.


-2

Die anderen Responder haben die meisten grundlegenden Punkte abgedeckt, aber für parallelisierbare Aufgaben führt ineffiziente Software zu erhöhten Hardwarekosten in Form von mehr Servern, die mehr Strom verbrauchen und mehr Platz und Wartung erfordern.

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.