W porządku… po pierwsze potrzebowałem czegoś, co spełniło to pytanie, ale potrzebowałem tego SZYBKO! Niestety „lepszym” sposobem jest prawie 600 linii kodu !!! Wybaczcie nazwę tego, która nie ma nic wspólnego z tym, co robi. Właściwa nazwa to Integer64ToCharArray (wartość int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Możesz spróbować wyczyścić ten kod bez obniżania wydajności.
Wejście: Dowolna wartość 64-bitowa ze znakiem od minimalnego do maksymalnego zakresu.
Przykład:
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';
Wynik:
Test: 9223372036854775807
Test: -9223372036854775808
Oryginalne testy prędkości: ( Integer64ToCharArray (); )
Wartość jednocyfrowa w najlepszym przypadku.
Pętle: 100 000 000, spędzony czas: 1381 (mili), czas na pętlę 13 (Nano)
Gorsza 20-cyfrowa wartość przypadku.
Pętle: 100 000 000, spędzony czas: 22 656 (mili), czas na pętlę 226 (Nano
Nowe testy szybkości projektowania: ( AddDynamicallyToBuffer (); )
Wartość jednocyfrowa w najlepszym przypadku.
Pętle: 100 000 000, spędzony czas: 427 (mili), czas na pętlę 4 (Nano)
Najgorszy przypadek 32-bitowy - 11-cyfrowa wartość.
Pętle: 100 000 000, spędzony czas: 1 991 (mili), czas na pętlę 19 (Nano)
Ujemny 1 bilion Najgorszy przypadek - 14-cyfrowa wartość.
Pętle: 100 000 000, spędzony czas: 5681 (mili), czas na pętlę 56 (nano)
64-bitowy gorszy przypadek - wartość 20 cyfr.
Pętle: 100 000 000, spędzony czas: 13 148 (mili), czas na pętlę 131 (Nano)
Jak to działa!
Wykonujemy technikę dzielenia i zwyciężania i po ustaleniu maksymalnej długości ciągu po prostu ustawiamy każdą wartość znaku indywidualnie. Jak pokazano w powyższych testach szybkości, większe długości powodują duże kary za wydajność, ale nadal jest znacznie szybsza niż oryginalna metoda pętli i żaden kod nie zmienił się między tymi dwiema metodami, a pętla nie jest już używana.
W moim użyciu stąd nazwa, zamiast tego zwracam przesunięcie i nie edytuję buforu tablic char, raczej zaczynam aktualizować dane wierzchołków, a funkcja ma dodatkowy parametr przesunięcia, więc nie jest zainicjowana na -1.