Speichereffizienz vs Prozessoreffizienz

stimmen
1

Im allgemeinen Gebrauch soll ich wette auf Speichereffizienz oder Prozessoreffizienz?

Am Ende weiß ich, dass Software / Hardware-Spezifikationen gemäß sein muß. aber ich denke, es gibt eine allgemeine Regel, wenn es keine Grenzen gibt.

Beispiel 01 (Speichereffizienz):

int n=0;   
if(n < getRndNumber())
    n = getRndNumber();

Beispiel 02 (Prozessor Effizienz):

int n=0, aux=0;
aux = getRndNumber();
if(n < aux)
    n = aux;

Sie sind nur einfache Beispiele und schrieb sie, um zu zeigen, was ich meine. Bessere Beispiele gut empfangen werden.

Danke im Voraus.

Veröffentlicht am 30/12/2009 um 01:40
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
-1

Prozessor Effizienz. Der Speicher ist in grober Weise langsam im Vergleich zu Ihrem Prozessor. Siehe diesen Link für weitere Informationen.

Obwohl in Ihrem Beispiel würde die zwei wahrscheinlich äquivalent durch den Compiler zu optimieren.

Beantwortet am 30/12/2009 um 01:41
quelle vom benutzer

stimmen
11

Ich gehe aus dem Universal-Performance Frage Trumpf Rad und sagen: „weder, Wette auf Richtigkeit“.

Schreiben Sie Ihren Code in dem klarste Weg, stellt spezifische und messbare Leistungsziele, messen Sie die Leistung Ihrer Software, das Profil zu, die Engpässe zu finden, und dann bei Bedarf optimieren zu wissen, ob Prozessor oder Speicher ist Ihr Problem.

(Als ob einen Fall in Punkt zu machen, Ihre ‚einfachen Beispiele‘ unterschiedliche Verhalten unter der Annahme getRndNumber () keinen konstanten Wert zurück. Wenn Sie es auf einfachste Art und Weise geschrieben haben, so etwas wie n = max(0, getRndNumber())dann kann es weniger effizient sein , aber es wäre besser lesbar und eher als korrekt.)


Bearbeiten:

Zur Beantwortung unter Dervin Kritik, sollte ich wohl sagen, warum ich glaube, dass es auf diese Frage keine allgemeine Antwort.

Ein gutes Beispiel ist eine Zufallsauswahl aus einer Folge nimmt. Für Sequenzen klein genug, um in einer anderen zusammenhängenden Speicherblock kopiert zu werden, ein Teil-Fisher-Yates-Verfahren, die Recheneffizienz begünstigt ist der schnellste Ansatz. Jedoch für sehr große Sequenzen, in denen nicht genügend Speicher verfügbar ist zuzuteilen, so etwas wie die Probennahme Reservoir Speichereffizienz begünstigt verwendet werden müssen; dies wird eine Größenordnung langsamer.

Also , was ist der allgemeine Fall hier? Zum Abtasten einer Sequenz sollten Sie bevorzugen CPU oder Speichereffizienz? Man kann nicht einfach sagen , ohne auf der Maschine laufen Dinge wie die durchschnittlichen und maximale Größen der Sequenzen, die Menge an physischen und virtuellen Speicher in der Maschine, die wahrscheinliche Anzahl der gleichzeitigen Proben genommen werden, um die CPU- und Speicheranforderungen des anderen Code zu wissen , und sogar Dinge wie , ob die Anwendung selbst muss Geschwindigkeit oder Zuverlässigkeit begünstigen. Und selbst wenn Sie das alles wissen, dann bist du immer noch nur zu raten , die Sie nicht wirklich wissen , was man zu begünstigen.

Deshalb ist die einzige vernünftige Sache zu tun ist, den Code in einer Art und Weise zu implementieren Klarheit und Wartbarkeit Begünstigung (unter Faktoren kennen Sie berücksichtigen, und diese Klarheit unter der Annahme, nicht auf Kosten der Brutto Ineffizienz), messen sie in einer realen Situation zu sehen ob es ein Problem verursacht und was das Problem ist, und dann ändern, wenn so es. Die meiste Zeit müssen Sie den Code nicht ändern, da es kein Engpass sein wird. Das Netto-Ergebnis dieses Ansatzes ist, dass man insgesamt eine klare und wartbare Codebasis haben, mit den Kleinteilen, die besonders CPU sein müssen und / oder Speicher effizient optimiert, so sein.

Beantwortet am 30/12/2009 um 01:45
quelle vom benutzer

stimmen
0

In den letzten 10 Jahren. Hauptspeicher hat fast gar nicht in der Geschwindigkeit erhöht, während Prozessoren haben sich weiter voran laufen. Es gibt keinen Grund zu glauben, dass dies ändern wird.

Edit: Übrigens, in Ihrem Beispiel wird aux höchstwahrscheinlich in einem Register am Ende und machen nie in den Speicher überhaupt.

Beantwortet am 30/12/2009 um 01:47
quelle vom benutzer

stimmen
0

Es ist auch den Umfang der Operation eine Überlegung wert, die Sie zu optimieren suchen; wenn die Betriebszeit empfindlich ist, sagt Teil einer Web-Anforderung oder GUI-Update könnte es besser sein, auf der Seite irrt sie schneller abgeschlossen als Speicher zu speichern.

Beantwortet am 30/12/2009 um 01:47
quelle vom benutzer

stimmen
2

Sie müssen auf der Grundlage der jeweiligen Anwendung, Nutzung usw. In Ihrem obigen Beispiel entscheiden, beiden Speicher und Prozessorauslastung ist trivial, so dass nicht ein gutes Beispiel.

Ein besseres Beispiel könnte die Verwendung von Verlaufstabellen in Schach sucht sein. Diese Methode Caches gesucht zuvor Positionen im Spielbaum, falls sie in anderen Zweigen der Spielbaum oder auf dem nächsten Zug wieder gesucht.

Es wird jedoch Kosten Raum um sie zu speichern und Raum erfordert auch Zeit. Wenn Sie zu viel Speicher aufbrauchen könnten Sie sich mit der virtuellen Speicher beenden, die langsam sein.

Ein weiteres Beispiel könnte Caching in einem Datenbank-Server sein. Natürlich ist es schneller aus dem Hauptspeicher ein im Cache gespeicherte Ergebnis zuzugreifen, aber dann wieder wäre es nicht eine gute Idee zu halten Laden und Befreiung von Speicherdaten, die unwahrscheinlich sind, wiederverwendet werden.

Mit anderen Worten, kann man nicht verallgemeinern. Sie können nicht einmal eine Entscheidung basierend auf dem Code machen - manchmal die Entscheidung hat im Rahmen der wahrscheinlichen Daten und Nutzungsmuster gemacht werden.

Beantwortet am 30/12/2009 um 03:14
quelle vom benutzer

stimmen
2

Sie denken, der einen zur anderen nichts zu tun hat? Warum denkst du, dass? Hier sind zwei Beispiele, wo man oft unberücksichtigte Engpässe finden.

Beispiel 1

Sie entwerfen eine DB-bezogene Software-System und feststellen, dass I / O Sie verlangsamt sich, wie Sie in einer der Tabellen lesen. Statt in mehreren I / O-Operationen mehrere Abfragen ermöglicht resultierenden Sie zuerst die gesamte Tabelle aufnehmen. Nun werden alle Zeilen der Tabelle sind im Speicher und die einzige Einschränkung sollte die CPU sein. Tätschelte sich auf der Rückseite Sie sich fragen, warum Ihr Programm auf Speicher schlechte Computer hideously langsam wird. Die Sanitäter haben Sie über den virtuellen Speicher vergessen, Swapping, und so weiter.

Beispiel 2

Sie schreiben ein Programm, wo Sie Ihre Methoden viele kleine Objekte, sondern besitzen O (1) erstellen, O (log) oder im schlimmsten Fall O (n) Geschwindigkeit. Sie haben auf Geschwindigkeit optimiert, aber sehen, dass Ihre Anwendung dauert eine lange Zeit zu laufen. Merkwürdigerweise Profil Sie zu entdecken, was die Ursache sein könnte. Um Ihren Verdruß entdecken Sie, dass alle diese kleinen Objekte schnell addiert. Der Code wird von der GC zurückgehalten.

Beantwortet am 31/12/2009 um 00:45
quelle vom benutzer

stimmen
0

Ohne Kontext denken Optimierung ich für etwas anderes als die Lesbarkeit und Flexibilität

Also, ich die einzige Regel zustimmen könnte ist „Optmise zur besseren Lesbarkeit, während im Auge irgendwann in der Zukunft die Möglichkeit dessen, dass Sie entweder optimieren müssen möglicherweise für Speicher oder Prozessoreffizienz in der Zukunft“.

Leider ist es nicht ganz so eingängig wie Sie möchten ...

In Ihrem Beispiel Version 2 ist deutlich besser, obwohl Version 1 ist mir schönere, da als andere haben darauf hingewiesen, ruft getRndNumber () mehrere Male erfordert mehr Wissen über getRndNumber () zu folgen.

Beantwortet am 31/12/2009 um 12:56
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more