Frage

Ich möchte BigDecimal verwenden, um Zahlen beliebiger Genauigkeit wie Preise und Mengen in einem Low-Latency-Trading-Anwendung darstellen mit Tausenden von Aufträgen und Ausführung Berichte pro Sekunde.

Ich werde nicht auf sie tun viele mathematische Operationen werden, so dass die Frage nicht über die Leistung des BigDecimal ist per se, sondern vielmehr darüber, wie große Mengen von BigDecimal Objekte Leistung der Anwendung beeinträchtigen würde.

Meine Sorge ist, dass sehr viel kurzlebige BigDecimal Objekte einen Stamm auf einem GC gestellt werden und führen zu einem größeren Stop-The-World Pausen in CMS Kollektor -. Und das ist auf jeden Fall, was ich vermeiden möchte

Können Sie bitte meine Bedenken bestätigen und Alternativen vorschlagen zu BigD mit? Auch wenn Sie denken, meine Bedenken sind falsch -. Bitte erklären, warum

Aktualisieren :

Vielen Dank für alle, die beantwortet. Ich bin jetzt überzeugt, dass BigDecimal verwendet, wird Latenz meiner Anwendung verletzt (obwohl ich immer noch, sie messen will).

Im Moment haben wir beschlossen, mit „sehr Nicht-OOP“ Lösung zu halten (aber ohne die Genauigkeit Hit) - Einsatz zwei ints, ein für Mantisse und ein anderes für Exponenten. Rationale dahinter ist, dass Primitive auf Stapel gelegt werden, nicht Haufen, und sind daher nicht Gegenstand der Garbage Collection.

War es hilfreich?

Lösung

Wenn Sie ein Low-Latency-Trading-Programm entwickeln, und Sie wollen wirklich zu konkurrieren in Latenz Bedingungen, dann BigDecimal ist für Sie nicht , ist es so einfach wie die . Wo Mikrosekunden Rolle, Objekterstellung und jede Dezimalzahl Mathe ist einfach zu teuer.

Ich würde behaupten, dass für fast alle anderen, BigDecimal verwendet, ist ein Kinderspiel, weil es wenig haben sichtbar Auswirkungen auf die Anwendungsleistung.

In latenzkritischen Systemen Handelsentscheidungen, jeder unberechenbar Garbage-Collection-Pausen sind völlig out-of-the-Frage so, während die aktuelle Garbage-Collection algos ist fantastisch im normalen Gebrauch, sie sind nicht unbedingt geeignet, wenn eine Verzögerung von 5 Millisekunden können Sie eine Menge Geld kosten. Ich würde erwarten, dass große Systeme wurden in einem sehr Nicht-OOP-Stil geschrieben, mit wenig oder gar keine Objekte abgesehen von einigen internierten Strings verwendet werden (für Codes und dergleichen).

Sie werden auf jeden Fall verwenden müssen double (oder auch float ) und die Genauigkeit Schlag nehmen.

Andere Tipps

JVMs sind ziemlich gut heute in Bezug auf die Schöpfung und Zerstörung von kurzlebigen Objekten Handhabung, so dass die nicht die Sorge, es war einmal.

Ich würde empfehlen, ein Mock-up zu bauen, was Sie tun wollen, und Maßnahme es. Das wird viel mehr wert sein als alle ‚theoretischen‘ Antworten, die Sie bekommen können: -)

Ein Blick auf Ihre speziellen Problemdomäne, ähnliche Systeme, die ich auf in der Vergangenheit Arbeit gearbeitet habe sehr gut mit Doppel für die Daten, die Sie für BigDecimal verwenden, und es kann sich lohnen, die erneute Prüfung Ihres Denkens in diesem Bereich. Ein flüchtiger Blick auf BigDecimal zeigt es 5 oder 6 Felder, und die zusätzlichen Speicherverbrauch über eine einzige Doppel keine Funktionalität Vorteile überwiegen Sie haben können.

hat BigDecimal Leistung haben sehr viel niedriger ist als, sagen wir, long, double oder sogar Long. Ob die einen signifikanten Unterschied zu der Leistung Ihrer Anwendung machen, hängt von Ihrer Anwendung.

Ich schlage vor, das Finden der langsamste Teil Ihrer Anwendung und einen Vergleichstest auf das zu tun. Ist es immer noch schnell genug? Wenn nicht, sollten Sie eine kleine unveränderliche Klasse zu schreiben, eine einzelne long enthält, möglicherweise für Überlauf überprüft.

Die große Frage ist: Haben Sie eigentlich Notwendigkeit beliebige Genauigkeit dezimal Berechnungen? Wenn die Berechnungen nur die Daten und Entscheidungen erfolgen auf dieser Grundlage zu analysieren, dann Abrunden und binäre Darstellung Artefakte unter den am wenigsten signifikanten Bits ist wahrscheinlich irrelevant für Sie; gehen Sie vor und Verwendung double nur (und analysieren Sie Ihre Algorithmen für numerische Stabilität ).

Wenn Sie sich tatsächlich Transaktionen zu tun, wo die Zahlen addieren und Präzision ankommt, absolut, dann ist double keine Option. Vielleicht können Sie diese beiden Teile Ihrer Anwendung und Nutzung BigDecimal trennen nur in der Transaktion teil.

Wenn das nicht möglich ist, dann bist du ziemlich viel Glück. Sie müßten eine BCD Mathematik-Bibliothek, und ich glaube nicht, Java hat man . Sie können versuchen, Ihre eigenen zu schreiben, aber es wird eine Menge Arbeit und das Ergebnis kann immer noch nicht wettbewerbsfähig sein.

, warum Sie nicht verwenden eine lange mit einer implizierten Anzahl der Nachkommastellen Fälle? Zum Beispiel, sagen wir, Sie 8 Dezimalstellen haben stillschweigend, dann würde 0,01 1000000.

Ich bin sicher nicht das, was sind Ihre Anforderungen, aber in der Regel, wenn finanzielle Berechnung einer tun kann die Genauigkeit nicht leisten Treffer durch Gleitkommatypen verursacht. Normalerweise Genauigkeit und die richtige Rundung ist wichtiger als Effizienz, wenn der Umgang mit Geld.
Wenn Sie nicht mit Prozentangaben und alle Beträge sind integer zu tun haben, können Sie Integer-Typen verwenden (int, lang oder sogar BigInteger) mit einer 0,01 Ihrer Währungseinheit bedeutet.
Und selbst wenn Sie denken, Sie Genauigkeit Erfolg bei double Typ leisten können, kann es sein, ein Versuch wert, zuerst mit BigDecimal und prüfen, ob es wirklich für Sie zu verlangsamen.

Ich arbeite für ein Team, dass leiten Leistungsbeurteilungen und Optimierungen auf Anwendungen, die vor kurzem eine Anwendung hatten die Java Big Dezimal wurde mit. Signifikante Performance-Probleme wurden mit der Speichernutzung beobachtet. Wir wechselten später zu Newton Raphson, die uns Genauigkeit mit Berechnungen halten dürfen und eine deutlich bessere Leistung zu großen dezimal gezeigt.

Just hinzuzufügen .. wenn wir verdoppelt haben wir einen massiven Verlust an Genauigkeit sah wie erwartet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top