Frage

Ich habe auf dieses Problem zu treffen, ob bignums in meiner Sprache als Standarddatentyp zu verwenden, wenn es der Zahlen beteiligt. Ich habe das selbst ausgewertet und reduzierte sie auf eine Bequemlichkeit und Komfort und die Leistung -Frage. Die Antwort auf diese Frage hängt davon, wie groß die Leistungseinbußen sind in Programmen, die nicht immer optimiert werden.

Wie klein ist der Aufwand für bignums an Orten, an denen eine Fixnum oder integer wäre, hätte ausgereicht? Wie klein kann es besten Implementierungen sein? Welche Art von Implementierungen erreichen den kleinsten Aufwand und welche Art von zusätzlichen Kompromissen Sie in sie führen?

Welche Treffer kann ich auf die Ergebnisse in der gesamten Sprache Leistung erwarten, wenn ich meine Sprache auf bignums auf Standard setzen wird?

War es hilfreich?

Lösung

Um ehrlich zu sein, ist die beste Antwort „versuchen Sie es und sehen“.

Klar bignums kann nicht so effizient wie native Typen sein, die in der Regel eine einzige CPU-Register passen, aber jede Anwendung ist anders -. Wenn Ihr nicht eine ganze Menge von Integer-Arithmetik macht dann könnte der Aufwand vernachlässigbar

Andere Tipps

Sie können vielleicht sehen, wie Lisp tut es. Es wird fast immer tun, um die genau rechts Sache und implizit die Typen konvertieren, wie es notwendig wird. Es hat fixnums ( „normal“ ganze Zahlen sind), bignums, Verhältnisse (reduzierte richtige Fraktionen als einen Satz von zwei ganzen Zahlen dargestellt) und Schwimmer (in verschiedenen Größen). Nur Schwimmer einen Präzisionsfehler haben, und sie sind ansteckend, das heißt, wenn eine Berechnung einen Schwimmer umfasst, ist das Ergebnis ein Schwimmer, auch. "Practical Common Lisp" hat eine gute Beschreibung für dieses Verhalten.

Kommen Sie, daran zu denken ... Ich glaube nicht, es überhaupt viel Leistung trifft haben.

Da bignums von der Natur, hat ein sehr große Basis, etwa eine Basis von 65.536 oder mehr, für die in der Regel maximal möglicher Wert für traditionellen Fixnum und ganze Zahlen sind.

Ich weiß nicht, wie groß Sie die bignum Basis zu sein gesetzt würden, aber wenn Sie setzen es ausreichend groß genug, so dass, wenn es anstelle von fixnums und / oder ganzen Zahlen verwendet wird, würde es nie sein erstes bignum stelligen überschreitet somit wird der Betrieb nahezu identisch zum normalen fixnums / int.

Dies eröffnet die Möglichkeit für Optimierungen, wo für eine bignum, die nie über sein erstes bignum stelligen wächst, können Sie sie mit uber-schnell einer bignum stelligen Operation ersetzen könnten.

Und dann schalten Sie auf n-stellige Algorithmen, wenn die zweite bignum einstelligen benötigt wird.

Dies könnte mit ein bisschen Flagge implementiert werden und eine Validierung der Operation auf allen Rechenoperationen, etwa denken, könnten Sie die Bit höchster Ordnung zu bedeuten bignum verwenden, wenn ein Datenblock auf 0 seine höchstwertige Bit gesetzt hat, dann verarbeiten sie, als ob sie normale Fixnum / ints waren aber wenn es auf 1 gesetzt ist, dann analysieren den Block als bignum Struktur und verwenden bignum Algorithmen von dort aus.

Das sollte Performance-Hits aus einfachen Schleife Iterator Variablen vermeiden, die ich denke, die erste mögliche Quelle für Performance Hits ist.

obwohl

Es ist nur mein grobes Denken, ein Vorschlag, da Sie sich besser wissen sollten als ich: -)

P. S. sorry, vergessen, was die Fachbegriffe von bignum einstelligen und bignum-Basis waren

Ihre Reduktion ist richtig, aber die Wahl hängt von den Leistungsmerkmalen Ihrer Sprache, die können wir nicht wissen

, sobald Sie Ihre Sprache implementiert haben, können Sie den Unterschied in der Leistung messen, und vielleicht dem Programmierer eine Richtlinie bieten den Standard wählen

Sie werden nie die tatsächliche Leistung Hit wissen, bis Sie Ihre eigenen Benchmark erstellen, wie die Ergebnisse pro Sprache, pro Sprache Revision variieren und pro CPU und. Es gibt keine sprachunabhängige Möglichkeit, dies mit Ausnahme der offensichtlichen Tatsache zu messen, dass ein 32-Bit-Integer-zweimal die Erinnerung an einem 16-Bit-Integer-verwendet.

  

Wie klein ist der Aufwand für bignums an Orten, an denen eine Fixnum oder integer wäre, hätte ausgereicht? Show klein kann es besten Implementierungen sein?

Die schlechte Nachricht ist, dass selbst in der bestmöglichen Software-Implementierung, BigNum als die builtin arithmetics um Größenordnung langsamer sein wird (das heißt alles von Faktor 10 bis 1000 Faktor).

Ich habe keine genauen Zahlen, aber ich glaube nicht, genaue Zahlen sehr viel in einer solchen Situation helfen: Wenn Sie große Zahlen benötigen, verwenden sie. Wenn nicht, nicht. Wenn Ihre Sprache sie standardmäßig verwendet (die Sprache tut? Einige dynamischen Sprachen zu tun ...), überlegen, ob der Nachteil in einer anderen Sprache Schalt für den Performance-Gewinn kompensiert wird (was es selten sein soll).

(was grob übersetzt werden könnte: Es gibt einen großen Unterschied ist, aber es sollte keine Rolle spielen Wenn (und nur dann) es darauf ankommt, verwenden Sie eine andere Sprache, denn selbst mit der bestmöglichen Umsetzung dieser. Sprache ist offenbar nicht gut geeignet für die Aufgabe.)

Ich bezweifle, total, dass es sich lohnen würde, es sei denn, es ist sehr domänenspezifisch ist.

Das erste, was in dem Sinne kommt sind alle wenig für Schleifen im gesamten Programm , ist das kleine Iterator Variablen alle Gonna bignums sein? Das ist beängstigend!

Aber wenn Ihre Sprache ist eher funktional ... dann vielleicht auch nicht.

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