15 Stimmen

Kann man generell davon ausgehen, dass toString() geringe Kosten verursacht?

Gehen Sie generell davon aus, dass toString() für ein beliebiges Objekt geringe Kosten verursacht (z. B. für die Protokollierung)? Ich schon. Ist diese Annahme gültig? Wenn sie hohe Kosten verursacht, sollte man das normalerweise ändern? Was sind triftige Gründe, eine toString()-Methode mit hohen Kosten zu erstellen? Das einzige Mal, dass ich über toString Kosten besorgt ist, wenn ich weiß, dass es auf eine Art von Sammlung mit vielen Mitgliedern ist. Von: http://jamesjava.blogspot.com/2007/08/tostring-cost.html

Update: Man kann es auch anders ausdrücken: Schauen Sie sich normalerweise die Kosten für den Aufruf von toString für eine bestimmte Klasse an, bevor Sie diese aufrufen?

40voto

Scott Hanselman Punkte 17602

Nein, ist es nicht. Weil ToString() von jedem überladen werden kann, können sie tun, was sie wollen. Es ist eine vernünftige Annahme, dass ToString() niedrige Kosten haben SOLLTE, aber wenn ToString() auf Eigenschaften zugreift, die "Lazy Loading" von Daten durchführen, könnten Sie sogar eine Datenbank innerhalb Ihrer ToString() treffen.

20voto

Eli Courtwright Punkte 174547

Die Java-Standardbibliothek scheint mit der Absicht geschrieben worden zu sein, die Kosten für toString-Aufrufe sehr niedrig zu halten. Zum Beispiel haben Java-Arrays und -Sammlungen toString-Methoden, die nicht über ihren Inhalt iterieren; um eine gute String-Darstellung dieser Objekte zu erhalten, müssen Sie entweder Arrays.toString ou Collections.toString von der java.util Paket.

Auch Objekte mit teuren equals-Methoden haben kostengünstige toString-Aufrufe. Zum Beispiel kann die java.net.URL Klasse hat eine equals-Methode, die eine Internetverbindung nutzt, um festzustellen, ob zwei URLs wirklich gleich sind, aber sie hat auch eine einfache und zeitlich konstante toString-Methode.

Also ja, kostengünstige toString-Aufrufe sind die Norm, und wenn Sie nicht gerade ein seltsames Paket eines Drittanbieters verwenden, das mit der Konvention bricht, sollten Sie sich keine Sorgen machen, dass dies lange dauert.

Natürlich sollten Sie sich erst dann Gedanken über die Leistung machen, wenn Sie sich in einer Situation befinden, in der Ihr Programm zu lange braucht, und selbst dann sollten Sie einen Profiler verwenden, um herauszufinden, warum es so lange dauert, anstatt sich im Voraus über solche Dinge Gedanken zu machen.

9voto

Ovid Punkte 11296

Der beste Weg, dies herauszufinden, ist ein Profil Ihres Codes. Anstatt sich jedoch Sorgen zu machen, dass eine bestimmte Funktion einen hohen Overhead hat, ist es (in der Regel) besser, sich um die Korrektheit Ihrer Anwendung zu kümmern und dann ein Leistungsprofil zu erstellen (aber seien Sie sich darüber im Klaren, dass sich der reale Einsatz und Ihr Testaufbau radikal unterscheiden können). Es hat sich herausgestellt, dass Programmierer in der Regel falsch einschätzen, was in ihrer Anwendung wirklich langsam ist, und sie verbringen oft viel Zeit damit, Dinge zu optimieren, die nicht optimiert werden müssen (die Beseitigung der dreifach verschachtelten Schleife, die nur 0,01 % der Zeit Ihrer Anwendung verbraucht, ist wahrscheinlich eine Verschwendung).

Glücklicherweise gibt es eine Vielzahl von Open-Source-Profiler für Java .

5voto

Shog9 Punkte 151504

Gehen Sie generell davon aus, dass toString() für ein beliebiges Objekt geringe Kosten verursacht? Ich schon.

Warum sollten Sie das tun? Profil Ihren Code, wenn Sie auf Leistungsprobleme stoßen; das spart Ihnen viel Zeit, wenn Sie an falschen Annahmen vorbeikommen.

3voto

Larry OBrien Punkte 8341

Im Titel Ihrer Frage werden die widersprüchlichen Wörter "sicher" und "im Allgemeinen" verwendet. Obwohl Sie in den Kommentaren den allgemeinen Fall zu betonen scheinen, auf den die Antwort wahrscheinlich "ja, im Allgemeinen ist es kein Problem" lautet, sehen viele Leute "sicher" und antworten daher entweder "Nein, denn es besteht die Gefahr einer willkürlich schlechten Leistung" oder "Nein, denn wenn Sie bei einer Leistungsfrage "sicher" sein wollen, müssen Sie muss Profil".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X