Okay ... zuerst brauchte ich etwas, das das tat, was diese Frage stellt, aber ich brauchte es SCHNELL! Leider ist der "bessere" Weg fast 600 Codezeilen !!! Verzeihen Sie den Namen, der nichts mit dem zu tun hat, was er tut. Der richtige Name war Integer64ToCharArray (int64_t-Wert);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Versuchen Sie, diesen Code zu bereinigen, ohne die Leistung zu beeinträchtigen.
Eingabe: Beliebiger vorzeichenbehafteter 64-Bit-Wert vom Min- bis Max-Bereich.
Beispiel:
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';
Ausgabe:
Test: 9223372036854775807
Test: -9223372036854775808
Ursprüngliche Geschwindigkeitstests: ( Integer64ToCharArray (); )
Bester Fall 1-stelliger Wert.
Schleifen: 100.000.000, Zeitaufwand: 1.381 (Milli), Zeit pro Schleife 13 (Nano)
Schlimmer Fall 20-stelliger Wert.
Schleifen: 100.000.000, Zeitaufwand: 22.656 (Milli), Zeit pro Schleife 226 (Nano
Neue Entwurfsgeschwindigkeitstests: ( AddDynamicallyToBuffer (); )
Bester Fall 1-stelliger Wert.
Schleifen: 100.000.000, Zeitaufwand: 427 (Milli), Zeit pro Schleife 4 (Nano)
32 Bit Worst Case - 11-stelliger Wert.
Schleifen: 100.000.000, Zeitaufwand: 1.991 (Milli), Zeit pro Schleife 19 (Nano)
Negativ 1 Billion Worst Case - 14-stelliger Wert.
Schleifen: 100.000.000, Zeitaufwand: 5.681 (Milli), Zeit pro Schleife 56 (Nano)
64-Bit-Worse-Case - 20-stelliger Wert.
Schleifen: 100.000.000, Zeitaufwand: 13.148 (Milli), Zeit pro Schleife 131 (Nano)
Wie es funktioniert!
Wir führen eine Divide and Conquer-Technik durch und sobald wir nun die maximale Länge der Zeichenfolge erreicht haben, setzen wir einfach jeden Zeichenwert einzeln. Wie in den obigen Geschwindigkeitstests gezeigt, erhalten die größeren Längen große Leistungseinbußen, aber es ist immer noch viel schneller als die ursprüngliche Schleifenmethode, und zwischen den beiden Methoden hat sich kein Code geändert, außer dass die Schleife nicht mehr verwendet wird.
In meiner Verwendung, daher der Name, gebe ich stattdessen den Offset zurück und bearbeite keinen Puffer mit Zeichenarrays. Stattdessen beginne ich mit der Aktualisierung der Scheitelpunktdaten. Die Funktion verfügt über einen zusätzlichen Parameter für den Offset, sodass dieser nicht auf -1 initialisiert wird.