Pekala .. öncelikle bu sorunun sorduğu şeyi yapacak bir şeye ihtiyacım vardı, ama HIZLI ihtiyacım vardı! Ne yazık ki "daha iyi" yol yaklaşık 600 satır koddur !!! Yaptığı şeyle hiçbir ilgisi olmayan adını affedin. Uygun ad Integer64ToCharArray idi (int64_t değeri);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Performansı engellemeden bu kodu temizlemeyi denemekten çekinmeyin.
Giriş: Minimumdan maksimum aralığa herhangi bir işaretli 64 bit değer.
Misal:
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';
Çıktı:
Test: 9223372036854775807
Test: -9223372036854775808
Orijinal Hız Testleri: ( Integer64ToCharArray (); )
En iyi durum 1 basamaklı değer.
Döngüler: 100.000.000, Harcanan Zaman: 1.381 (Milyon), Döngü Başına Süre 13 (Nano)
Daha Kötü Durum 20 Haneli Değer.
Döngüler: 100.000.000, Harcanan Zaman: 22.656 (Milyon), Döngü Başına Zaman 226 (Nano
Yeni Tasarım Hız Testleri: ( AddDynamicallyToBuffer (); )
En iyi durum 1 basamaklı değer.
Döngüler: 100.000.000, Harcanan Zaman: 427 (Milli), Döngü Başına Süre 4 (Nano)
32 Bit En Kötü Durum - 11 basamaklı Değer.
Döngüler: 100.000.000, Harcanan Zaman: 1.991 (Milyon), Döngü Başına Zaman 19 (Nano)
Negatif 1 Trilyon En Kötü Durum - 14 haneli Değer.
Döngüler: 100.000.000, Harcanan Zaman: 5.681 (Milyon), Döngü Başına Süre 56 (Nano)
64 Bit Daha Kötü Durum - 20 Haneli Değer.
Döngüler: 100.000.000, Harcanan Zaman: 13.148 (Milyon), Döngü Başına Süre 131 (Nano)
Nasıl çalışır!
Bir Divide and Conquer tekniği uyguluyoruz ve şimdi dizenin maksimum uzunluğunu belirledikten sonra her karakter değerini ayrı ayrı ayarlıyoruz. Yukarıdaki hız testlerinde gösterildiği gibi, daha büyük uzunluklar büyük performans cezaları alır, ancak yine de orijinal döngü yönteminden çok daha hızlıdır ve iki yöntem arasında gerçekte hiçbir kod değişmemiştir, diğer durumda döngü artık kullanımda değildir.
Benim kullanımımda bu nedenle, bunun yerine ofseti döndürüyorum ve bir char dizileri arabelleğini düzenlemiyorum, bunun yerine köşe verilerini güncellemeye başlıyorum ve işlevin offset için ek bir parametresi var, bu yüzden -1 olarak başlatılmamış.