Ich habe das bemerkt
%Vor%Beim Drucken des aktuellen Werts einer Variablen wird die Leistung beendet. Ich möchte es gelegentlich drucken, aber die Kosten für diese Operation gering halten.
Wie können Sie die Kosten für den Druck mit dem Bildschirm mit der Berechnung vergleichen? Gibt es irgendwelche Tricks, um diese Kosten zu minimieren [Sollte ich einen von 10 Datensätzen drucken, oder wird dies wegen der bedingten Kontrolle genauso viel kosten]?
Warum brauche ich das? Nun, ich mache lustige Sachen mit Java (zB "finde ein Gegenbeispiel für Eulers Konjunktion ... 27 ^ 5 + 84 ^ 5 + 110 ^ 5 + 133 ^ 5 = 144 ^ 5 (Lander & amp; Parkin, 1966), "). Ich möchte ein Programm schreiben, das sowohl korrekt als auch schnell ist (dieses Gegenbeispiel wurde in den 60ern entdeckt, also sollte ich es in angemessener Zeit tun können). Während des Debuggens möchte ich so viele Informationen wie möglich haben und ich möchte das Gegenbeispiel so schnell wie möglich finden. Was ist meine beste Vorgehensweise? Jeden Fall drucken? - Zu langsam. Lass es über Nacht laufen? Was ist, wenn ich etwas i++
verpasst habe?
Wie können Sie die Kosten für den Druck mit dem Bildschirm mit der Berechnung vergleichen?
Es ist nicht möglich. Die Kosten (d. H. Verstrichene Zeit) des Druckens hängen davon ab, wo die "gedruckten" Zeichen liegen. Ich kann trivialerweise ein Beispiel konstruieren, bei dem die Kosten gegen unendlich gehen.
%Vor% Nach einigen Zeilen der Ausgabe füllen sich die Pipeline-Puffer und die Aufrufe print
in Ihrer Anwendung blockieren.
Gibt es irgendwelche Tricks, um diese Kosten zu minimieren [Sollte ich einen von 10 Datensätzen drucken, oder wird dies wegen der bedingten Kontrolle genauso viel kosten]?
Es gibt nichts, was keinen weiteren Overhead verursachen würde; z.B. der Aufwand für das Testen, ob gedruckt werden soll oder nicht.
Die einzige Möglichkeit, den Druckaufwand vollständig zu eliminieren, besteht darin, überhaupt nicht zu drucken , während Sie versuchen, die Leistung zu messen.
Was ist meine beste Vorgehensweise? Jeden Fall drucken? - Zu langsam. Lass es über Nacht laufen? Was, wenn ich etwas i ++ verpasst habe?
Führen Sie zuerst das Programm mit den print-Anweisungen aus, um zu überprüfen, ob Sie die richtigen Antworten erhalten.
Entfernen Sie die Druckanweisungen und führen Sie sie erneut aus, um Ihre Leistungsmessungen zu erhalten.
Allerdings:
Ja, das Drucken ist teuer. Ein Prozessor kann Millionen von Operationen in der Zeitspanne ausführen, die zum Drucken auf dem Terminal / der IDE benötigt wird. Wenn Sie Eclipse oder Terminal verwenden, ist es sehr zeitaufwendig. Wenn Sie ein Terminal verwenden Sie müssen es mit >>
oder >
in eine Datei umleiten oder es in eine Datei schreiben, indem Sie nio
oder io
library verwenden. Drucken Sie alles nur dann, wenn es unvermeidlich ist, sonst denke ich, dass Sie niemals drucken sollten, wenn Leistung ein Problem ist.
Das Folgende ist das Schnellste, was Sie tun können, um die nächste Primzahl zu berechnen und alle Zahlen zu drucken, die Sie in diesem Prozess getestet haben (vorausgesetzt, die nächste Primzahl verursacht keinen Überlauf von int):
%Vor% Wenn Sie Ihre Code-Leistung messen müssen, können Sie keine print-Anweisungen haben. Für einige Iterationen müssen Sie drucken, debuggen und die Druckanweisungen entfernen, sobald Sie wissen, dass Ihr Code korrekt funktioniert. Und dann mach mal Zeit für deinen Code.
Andernfalls, wenn Sie in Ihrem Code immer Druckanweisungen haben möchten, können Sie entscheiden, wie viel Verzögerung Sie akzeptieren können. Zum Beispiel kann ein Xeon-Prozessor Ihnen 28-35 Gflops / IOPS (Operationen pro Sekunde) geben, das bedeutet, dass der Prozessor 35 * 10 ^ 9 Inkrementoperationen pro Sekunde ausführen kann (es kann i++
für 35 * 10 ^ 9 Mal tun / Sek). und nach diesem ( Ссылка ) beantworten System.out.println () etwa 1 ms. Das bedeutet, wenn Sie für alle 10 ^ 6 i++
drucken, wird Ihre verbrauchte Zeit verdoppelt.
Wie können Sie die Kosten für den Druck mit dem Bildschirm mit der Berechnung vergleichen?
Indem Sie es messen: Implementieren Sie beide Ansätze (drucken Sie jede Zeile, drucken Sie alle x Zeilen) und sehen Sie, welche schneller ist, und fahren Sie mit x für einen vernünftigen Kompromiss zwischen häufigen Statusaktualisierungen und Durchsatz fort.
Es ist wichtig zu beachten, dass die Druckkosten stark davon abhängen, was Sie drucken. Ist der Stream gepuffert oder spült er jede Nummer? Speichert es in den Speicher, auf eine SSD, eine gewöhnliche Festplatte oder ein Laufwerk, das an einen langsamen USB-1-Port angeschlossen ist? Das kann die Schreibleistung um den Faktor 1000 verändern, weshalb Sie Ihren speziellen Anwendungsfall messen sollten.
Ein Ansatz dazu könnte Folgendes sein:
Führen Sie Ihre Aufgabe in einem Thread aus, der einen allgemeinen Puffer (Zeichenfolge? Instanz einer Informationsklasse?) mit den Inhalten aktualisiert, die Sie ausgeben möchten, aber nicht die tatsächliche Ausgabe in diesem Thread ausführen. Achten Sie darauf, diesen Puffer zu sperren, damit Sie sicher von verschiedenen Threads auf diese Informationen zugreifen können.
Lassen Sie dann einen Timer / anderen Thread auf diesen gemeinsamen Puffer zugreifen, um diese Informationen auszudrucken. Auf diese Weise entkoppeln Sie die Berechnung von der Ausgabe. Der Nachteil ist, dass Sie nicht alle Ausgaben sehen, aber während die Ausgabe generiert wird, wird die Berechnung fortgesetzt.
Kurze Antwort ist: Es kommt darauf an. Drucken von Text ist teuer. Hundert "print i" ist viel teurer als das Erstellen von Strings mit einem Stringbuilder und das einmalige Auslösen von "print".
Tags und Links java performance