Speicher und Leistung

8

Das war mir immer beim Programmieren wichtig, also dachte ich, ich würde es ausspucken, bevor es mich wirklich erreicht.

Worüber sollte ich mir mehr Sorgen machen? Der Speicher, den die Anwendung verbraucht, oder die Leistung, die sie benötigt. Damit meine ich, dass ich mich darauf konzentrieren sollte, weniger Speicher für die Anwendung zu verwenden und mehr Leistung zu verwenden (z. B. Laden über Datenbank und Dumping nach Gebrauch), oder weniger Leistung und mehr Speicher verwenden (z. B. Zwischenspeicherung) >

Meine Bedingungen für die Bewerbung: - Es ist eine Server-Anwendung, so dass es nicht auf Desktops ausgeführt werden soll, etc, ich habe 6 GB RAM und ich habe einen Quad-Core.

    
TheAJ 13.12.2009, 23:18
quelle

14 Antworten

14

Ihre Frage hat viele Antworten auf den Zen-Buddhismus hervorgerufen. Ich hoffe es besser zu machen.

Ihr Speicherlimit ist schwer: Wenn Sie es überschreiten, selbst wenn es virtuellen Speicher gibt, wird Ihre App krabbeln und Sie werden die Lachnummer von allen sein.

Ihre CPU-Zeit ist unbegrenzt: Ihre App wird sich die Zeit nehmen, die sie benötigt; hoffentlich wird es ausreichend parallel sein, dass alle 4 CPUs zum größten Teil mit voller Kraft kochen werden, bis deine App fertig ist.

Viele Probleme der Informatik haben eine Vielzahl von Lösungen mit verschiedenen Kompromissen des Gedächtnisses gegen die Zeit. Also: Seien Sie großzügig mit der Erinnerung, bis Sie mindestens die Hälfte davon verwenden (wenn das hilft; vergeuden Sie nicht die Erinnerung für das Ganze!), Aber hören Sie auf, solange genug Speicher übrig ist, dass Sie sich keine Sorgen machen müssen begrenzen, auch in Ausnahmefällen oder versehentlich.

Nachdem Sie Ihre Speicherressourcen zugewiesen haben, können Sie versuchen, aus Ihrem Code weitere kleine Leistungsverbesserungen zu erzielen. Aber übertreiben Sie es nicht.

Fertig.

P.S. Wenn es nicht korrekt und zuverlässig funktioniert, ist der gesamte vorhergehende Aufwand wertlos. Denken Sie immer daran!

Viel Glück.

    
Carl Smotricz 13.12.2009, 23:48
quelle
6

Berücksichtigen Sie die Menge der Daten, mit denen Sie zu tun haben, und die Reaktionsfähigkeit, die Sie benötigen. Denken Sie über das Design nach. Bauen Sie es auf, um es wartbar zu machen und es zum Laufen zu bringen.

Dann Profil, und adressieren Sie Ihre tatsächlichen Engpässe.

    
retracile 13.12.2009 23:23
quelle
4

Es hängt wirklich von der Art des Programms ab. Wenn Sie die Zielmaschinen steuern können, macht es es ein bisschen einfacher. Wenn Sie wissen, dass Sie auch in den Extremfällen nicht genug Speicher haben werden, dann können Sie auch alles verwenden, was Sie wollen. Es gibt keinen Vorteil im Speicher, der von nichts benutzt wird.

Im Allgemeinen denke ich über Dinge in mehreren Kategorien nach.

Zusätzliche Programme, Wenn das Programm nicht die primäre Verwendung des Rechners ausführt, sollte es versuchen, Speicher zu sparen. Während es keine Server-Sache ist, denke ich in diesem Fall an Desktop-Widgets und Tomboy. Das sind sie nicht die primäre Verwendung, also sollten sie nicht zu viele Ressourcen aus dem System nehmen, die möglicherweise die Leistung der primären Anwendung beeinträchtigen könnte.

Allgemeine Anwendungen, Diese haben einfache Prioritäten. Erstens, mach die Arbeit, wenn es langsam ist, mach es schneller. Sie sollten sich nicht zu viel Gedanken um den Speicher machen müssen, es sei denn, Sie sind tollkühn (oder benutzen Python oder Java :-))

Viele Instanzanwendungen Wenn Sie erwarten, dass der Benutzer viele Instanzen der Anwendung entweder als mehrere Aufgaben oder nur als mehrere Instanzen innerhalb der gleichen Aufgabe hat (wie mehrere Firefox-Fenster / Registerkarten), müssen Sie die Speicherbelegung im Griff behalten, da die Dinge multiplizieren. Geschwindigkeit ist nicht so sehr ein Problem, um Operationen schneller zu machen, sondern um sicherzustellen, dass inaktive Instanzen keine Verarbeitung durchführen.

Jumbo-Anwendungen Wenn Ihre Anwendung tatsächlich eine große Aufgabe zu erfüllen hat, wie zum Beispiel die Bildbearbeitung, sollten Sie die Speicherbelegung von Anfang an berücksichtigen. Ich vermute, dass Evolution viel Ram verbraucht (derzeit 142 Megabyte auf meinem Rechner), weil sie eine Jumbo-Aufgabe hatten, aber sie haben es nicht bemerkt. Ich habe viele E-Mails, meist aus Listen kommend,

Wenn Sie Ihre Zielumgebung kontrollieren können, dann können Sie einfach so viel RAM wie nötig haben. Es ist einfacher für Sie. Wenn andere Benutzer Ihr Programm haben, ist es für Sie noch einfacher, mehr Arbeitsspeicher zu benötigen, aber es ist nicht benutzerfreundlich.

Ich mache Entwicklung auf einem OLPC XO, hauptsächlich versucht, das System mit zusätzlichen Programmen nett zu machen. Das bedeutet, dass ich mich wirklich auf geringe Speicherauslastung konzentriere, aber selbst auf einem System mit eingeschränktem Speicher finde ich, dass es wenig sinnvoll ist, die Speichernutzung weiter zu reduzieren. Nach dem Start hat es mehr als 150 Megabyte frei. Das ist genug, um all die leichten Apps laufen zu lassen, aber die meisten schwereren Apps werden eine Belastung darstellen. Es gibt sehr wenig Mittelweg. Weitere Optimierung einer 2-Megapixel-App, um nur eine Megabyte zu verwenden, gibt dir nicht so viel Spielraum, wenn du eine App wie Firefox startest.

    
Lerc 14.12.2009 00:02
quelle
3
  1. Lass es funktionieren.

Du wirst verschiedene Antworten bekommen und es hängt ehrlich von der Anwendung ab. Es gibt keine allgemeine Antwort, die alle Fälle abdeckt, außer:

  1. Lass es funktionieren.

Software kann überlegt werden.

Die meisten Betriebssysteme eignen sich sehr gut für das Caching von Festplatten-I / O - wenn Sie beispielsweise mit einer SQLite-Datenbank viel arbeiten, wenn Sie einige Verbindungen im laufenden Betrieb haben Das System wird wahrscheinlich das ganze Ding in Erinnerung haben. Überlebe das Betriebssystem in den meisten Fällen nicht.

    
Jed Smith 13.12.2009 23:22
quelle
2

Es gibt keine richtige Wahl - das hängt von Ihrer Anwendung und ihren Anforderungen ab. Es ist jedoch oft eine oder die andere Wahl - Sie können nicht oft (wenn überhaupt) die Leistung maximieren und den Speicherverbrauch reduzieren. Wenn es sich um ein kritisches System handelt, sollten die maximalen Grenzen für den Speicher und / oder die niedrigsten Grenzen für die Leistung vom Kunden festgelegt werden - falls dies nicht der Fall ist, sollte dies der Fall sein.

    
Thomas Owens 13.12.2009 23:22
quelle
2

Diese Frage ist so alt wie die Programmierung selbst. Die Antwort ist leider "es kommt darauf an." Wenn Sie eine Anwendung für ein System mit 32 GB RAM schreiben und nur Ihre Software ausgeführt wird, sollten Sie Ihren Code schreiben, um davon profitieren zu können. Wenn Sie andererseits Code schreiben, der auf einem eingebetteten System ausgeführt wird, sollten Sie wahrscheinlich so wenig Speicher wie möglich verwenden. Was ist am wichtigsten ist, dass Sie diese Kompromisse bewusst sind, profilieren Sie Ihren Code und optimieren, was auch immer der größte Engpass ist.

    
Benson 13.12.2009 23:30
quelle
1

Auch bei Ihren angegebenen Spezifikationen hängt dies immer noch von der Arbeitslast ab, die Ihre Anwendung sehen wird.

  • Wenn Sie kleine Datenmengen gleichzeitig verarbeiten, können Sie die Leistung optimieren, indem Sie die nächsten N Chunks vorab abrufen und dadurch den Speicherverbrauch erhöhen.
  • Wenn Ihre Daten ziemlich groß sind, füllt sie Ihren Hauptspeicher möglicherweise schon bald vollständig aus, und das Lesen im Voraus führt zu einem Thrashing (z. B. das Lesen von Daten schreibt die Daten zurück auf die Festplatte / Datenbank, bevor sie vollständig verarbeitet werden; dann benötigen Sie diese Daten) in den Speicher zurück und erzwingen dadurch den Austausch dieser Read-Ahead-Werte).

Bekommen Sie zuerst eine funktionierende Version Ihrer App. Machen Sie dann Profiling und sehen Sie, was die Engpässe sind. (Vorzeitige Optimierung ist die Wurzel allen Übels! - Donald E. Knuth)

    
BjoernD 13.12.2009 23:24
quelle
1

Sie sind beide wichtig. Sie möchten möglicherweise bestimmte Objekte im Speicher zwischenspeichern, um eine bessere Leistung zu erzielen, wodurch der Speicherbedarf erhöht werden kann. Auf der anderen Seite, wenn Ihre Anwendung viel Zeit mit der Garbage Collection (wie in .net) oder mit nicht verwalteten Ressourcen beschäftigt, die den Speicher noch nicht freigegeben haben, werden Sie Leistungsprobleme haben

    
ram 13.12.2009 23:24
quelle
1

Ich denke, Sie sollten daran arbeiten, ein Gleichgewicht zwischen Speicher- und Prozessornutzung zu erreichen.

Wenn Sie an einer Serverkomponente arbeiten, würde ich mir Sorgen machen, dass es mit mehreren Benutzern funktioniert. Wie viele Nutzer kann Ihre Anwendung bedienen? Können Sie mehr Benutzer mit denselben Ressourcen verwenden?

    
Rubens Farias 13.12.2009 23:25
quelle
1

Sie können sich die Leistung in Bezug auf Durchsatz und Reaktionszeit vorstellen. Suchen Sie nach Möglichkeiten, diese beiden Faktoren zu messen, und legen Sie fest, welche Art von Last Ihr System von dort aus verarbeiten und verarbeiten muss. Die Speicher / Verarbeitungszeit (was Sie "Performance" nennen) Entscheidungen kommen, sobald Sie Ihren Durchsatz / Reaktionszeit unter Last gemessen haben. Im Allgemeinen sollten Sie versuchen, so viel CPU wie möglich zu verwenden (um den besten Durchsatz zu erzielen), so dass Sie den gesamten verfügbaren Speicher ausnutzen können.

    
Francis Upton 13.12.2009 23:26
quelle
1

Was benötigen Ihre Kunden?

Sie sollten zumindest eine Vorstellung davon haben, auf welcher Plattform Ihre Benutzer sie ausführen. Sie müssen auch eine Vorstellung von den Leistungsanforderungen (Transaktionen pro Sekunde oder was auch immer) haben. Erstellen Sie einige konservative Schätzungen der Mindestspezifikations-Plattform, die Sie benötigen, und entwerfen Sie diese dann.

Sie scheinen in Ihrem Beitrag auch etwas verwirrt zu sein - die Verwendung von weniger Speicher ist kein Endziel, wenn es zum Zwischenspeichern verwendet werden soll (d. h. Sie verwenden tatsächlich den gespeicherten Speicher, um die Leistung zu verbessern). In diesem Fall gehen Sie für das, was Sie am meisten pro Entwickler-Stunde gibt.

    
Robert Tuck 14.12.2009 00:52
quelle
1

Es ist am besten, nicht abstrakt, sondern konkret zu denken.

  1. Wenn Ihnen der Arbeitsspeicher nicht mehr ausreicht, sollten Sie Ihre Datenstruktur so sauber und einfach wie möglich halten, auch wenn es so aussieht, als müssten Sie einige Loops programmieren, die möglicherweise ineffizient sind. Eine komplexere Code- und Datenstruktur aufgrund von Leistungsbedenken ist der Kern einer vorzeitigen Optimierung. Und so sehr die Leute gegen die vorzeitige Optimierung anklagen und behaupten, sie tun es nicht, sie tun es trotzdem, zu einem beängstigenden Grad.

  2. Wenn es funktioniert und tut, was Sie tun müssen, und wenn Sie tatsächlich ein oder mehrere Leistungsprobleme haben, dann sollten Sie mit der Leistung umgehen. Die übliche Methode ist ein Profiling-Tool, aber das ist die Methode I bevorzugen .

Vorsicht bei Multi-Kernen. Parallelität und Threads ermöglichen es Ihnen, mehrere zeitlich überlappende Agenten zu verwenden, z. B. Festplattenköpfe, CPUs oder menschliche Clients. Wenn Ihre Prozesse zum Beispiel I / O-gebunden sind, hilft Ihnen der Versuch, sie auf mehreren Kernen auszuführen, nicht viel und kann weh tun. Wenn es nur ein einzelnes physisches Laufwerk gibt, werden Sie möglicherweise nicht viel gewinnen, wenn Sie versuchen, E / A-gebundene Threads zu überlappen, und das könnte schaden. Auf der anderen Seite, wenn Sie einen Thread pro Benutzer haben, könnte das sinnvoll sein, da solche Threads die meiste Zeit damit verbringen, auf den Benutzer zu warten.

    
Mike Dunlavey 14.12.2009 01:58
quelle
0

Es hängt von vielen Faktoren ab. Welche der beiden wird zuerst einschränkend sein? Müssen andere Anwendungen auf demselben Server ausgeführt werden? Welche ist schwieriger zu erweitern?

    
Paul 13.12.2009 23:23
quelle
0

Kommt drauf an

Stellen Sie eine konkrete Frage!

BEARBEITEN: Wenn Sie während der Entwurfsphase über das Caching nachdenken, gehen Sie zurück zum Anfang und starten Sie es erneut (Caching ist immer eine Kompromisslösung!

    
Frunsi 13.12.2009 23:24
quelle

Tags und Links