Muy bien ... en primer lugar, necesitaba algo que hiciera lo que esta pregunta es, ¡pero lo necesitaba RÁPIDO! Desafortunadamente, la forma "mejor" es de casi 600 líneas de código. Perdone el nombre que no tiene nada que ver con lo que está haciendo. El nombre correcto era Integer64ToCharArray (valor int64_t);
https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp
Siéntase libre de intentar limpiar ese código sin afectar el rendimiento.
Entrada: cualquier valor de 64 bits con signo desde el rango mínimo al máximo.
Ejemplo:
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';
Salida:
Test: 9223372036854775807
Test: -9223372036854775808
Pruebas de velocidad originales: ( Integer64ToCharArray (); )
En el mejor de los casos, valor de 1 dígito.
Bucles: 100,000,000, tiempo empleado: 1,381 (Milli), tiempo por bucle 13 (Nano)
En el peor de los casos, valor de 20 dígitos.
Bucles: 100,000,000, tiempo invertido: 22,656 (Milli), tiempo por bucle 226 (Nano
Nuevas pruebas de velocidad de diseño: ( AddDynamicallyToBuffer (); )
En el mejor de los casos, valor de 1 dígito.
Bucles: 100.000.000, tiempo empleado: 427 (Milli), tiempo por bucle 4 (nano)
Peor caso de 32 bits: valor de 11 dígitos.
Bucles: 100,000,000, tiempo empleado: 1,991 (Milli), tiempo por bucle 19 (nano)
1 billón negativo en el peor de los casos: valor de 14 dígitos.
Bucles: 100,000,000, tiempo empleado: 5,681 (Milli), tiempo por bucle 56 (Nano)
64 bits en el peor de los casos: valor de 20 dígitos.
Bucles: 100,000,000, tiempo empleado: 13,148 (Milli), tiempo por bucle 131 (Nano)
¡Cómo funciona!
Realizamos una técnica de Divide and Conquer y una vez que tenemos la longitud máxima de la cadena, simplemente establecemos el valor de cada carácter individualmente. Como se muestra en las pruebas de velocidad anteriores, las longitudes más grandes tienen grandes penalizaciones de rendimiento, pero aún es mucho más rápido que el método de bucle original y ningún código ha cambiado entre los dos métodos, además de que el bucle ya no está en uso.
En mi uso, de ahí el nombre, devuelvo el desplazamiento en su lugar y no edito un búfer de matrices de caracteres, sino que comienzo a actualizar los datos de vértice y la función tiene un parámetro adicional para el desplazamiento, por lo que no se inicializa en -1.