เอาล่ะ .. ประการแรกฉันต้องการบางอย่างที่ตอบคำถามนี้ได้ แต่ฉันต้องการมันอย่างรวดเร็ว! น่าเสียดายที่วิธี "ดีกว่า" คือโค้ดเกือบ 600 บรรทัด !!! ให้อภัยชื่อมันที่ไม่ได้เกี่ยวอะไรกับมัน ชื่อที่ถูกต้องคือInteger64ToCharArray (ค่า int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
อย่าลังเลที่จะลองทำความสะอาดโค้ดนั้นโดยไม่ขัดขวางประสิทธิภาพ
อินพุต:ค่า 64 บิตที่ลงชื่อใด ๆ จากช่วงต่ำสุดถึงสูงสุด
ตัวอย่าง:
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';
เอาท์พุต:
Test: 9223372036854775807
Test: -9223372036854775808
การทดสอบความเร็วดั้งเดิม: ( Integer64ToCharArray (); )
กรณีที่ดีที่สุดมูลค่า 1 หลัก
ลูป: 100,000,000, เวลาที่ใช้: 1,381 (ล้าน), เวลาต่อลูป 13 (นาโน)
กรณีที่เลวร้ายยิ่งค่า 20 หลัก
ลูป: 100,000,000, เวลาที่ใช้: 22,656 (มิลลิวินาที), เวลาต่อลูป 226 (นาโน
การทดสอบความเร็วในการออกแบบใหม่: ( AddDynamicallyToBuffer (); )
กรณีที่ดีที่สุดมูลค่า 1 หลัก
ลูป: 100,000,000, เวลาที่ใช้: 427 (ล้าน), เวลาต่อลูป 4 (นาโน)
32 Bit Worst Case - มูลค่า 11 หลัก
ลูป: 100,000,000, เวลาที่ใช้: 1,991 (มิลลิวินาที), เวลาต่อลูป 19 (นาโน)
Negative 1 Trillion Worst Case - มูลค่า 14 หลัก
ลูป: 100,000,000, เวลาที่ใช้: 5,681 (ล้าน), เวลาต่อลูป 56 (นาโน)
64 Bit Worse Case - ค่า 20 หลัก
ลูป: 100,000,000, เวลาที่ใช้: 13,148 (ล้าน), เวลาต่อลูป 131 (นาโน)
มันทำงานอย่างไร!
เราใช้เทคนิค Divide and Conquer และเมื่อเรามีความยาวสูงสุดของสตริงแล้วเราก็ตั้งค่าอักขระแต่ละตัวทีละตัว ดังที่แสดงไว้ในการทดสอบความเร็วด้านบนความยาวที่มากขึ้นจะได้รับบทลงโทษที่มีประสิทธิภาพมาก แต่ก็ยังเร็วกว่าวิธีการวนซ้ำแบบเดิมและไม่มีการเปลี่ยนแปลงรหัสระหว่างสองวิธีอื่นจากนั้นการวนซ้ำจะไม่ใช้งานอีกต่อไป
ในการใช้งานของฉันดังนั้นชื่อฉันจึงคืนค่าชดเชยแทนและฉันไม่ได้แก้ไขบัฟเฟอร์ของอาร์เรย์ถ่าน แต่ฉันจะเริ่มอัปเดตข้อมูลจุดยอดและฟังก์ชันมีพารามิเตอร์เพิ่มเติมสำหรับการชดเชยดังนั้นจึงไม่ได้เริ่มต้นเป็น -1