¿Cuál es la forma más rápida de invertir una cadena con más de 10000 caracteres?

Debido a que cada personaje debe moverse a otra ubicación de memoria, no hay mucha optimización que pueda hacer.

Sin embargo, como la RAM es más lenta que los registros y la memoria caché, puede leer fragmentos de tamaño de palabra, invertir el orden en el registro y volver a escribirlo. Supongo que estamos tratando con caracteres de 8 bits. En los sistemas de 64 bits, puede leer 8 caracteres en un registro, organizar los bytes en otro registro y volver a escribirlos en una nueva ubicación. Supongamos que ULong es de 64 bits:

registrarse ULong c = * inputString;
* outputString =
((c & 0x00FF) << 56) |
((c & 0xFF00) << 48) |
..
inputString ++;
outputString–;

Reescribiré esa expresión hasta que el compilador genere inserciones de bits en lugar de shift y / o … Por lo general, los compiladores son compatibles con estos contenedores de ensamblaje (como __clz (…) para contar la instrucción de ceros a la izquierda). Si es así, puede usar explícitamente esos contenedores ..

Por cierto, la falta de alineación de datos podría ralentizar el proceso, pero creo que las CPU de hoy se están manejando muy bien. (No he estado trabajando en la plataforma Intel durante mucho tiempo). También debe tener en cuenta los fragmentos que son más pequeños que el tamaño de la palabra.

La forma más optimizada es escribir todo el código en ensamblador. Las instrucciones SIMD (instrucción única de datos múltiples) son muy buenas para reorganizar … En el ensamblaje, puede dar una pista a la CPU para precachear los datos (en la dirección de lectura) o “escribir sin leer”, etc. también. -temporal? Me oxidé en mi ensamblaje Intel .. 🙂

PD: volví a visitar el código para hacerlo más comprensible.

una manera manasi ya ha dicho. De una manera más, puedes lograr invertir una Cadena. Mediante el uso del método StringBuilder reverse () de la clase StringBuilder

String str = “hola”;
StringBuilder sb = new StringBuilder (str);
Cadena str1 = sb.reverse (). ToString ();
System.out.println (str1);

La forma más rápida de revertir una cadena es no revertirla, en su lugar, iterar sobre ella hacia atrás (aunque eso puede ser un poco más lento que hacia adelante)

De lo contrario, solo haga lo siguiente:

rev vacío (string & s)
{
int right = s.size () – 1;
int left = 0;
char c;
mientras (izquierda {
c = s [izquierda];
s [izquierda] = s [derecha]
s [derecha] = c;
++ izquierda;
-Derecha;
}
}

El algoritmo std :: reverse () probablemente hace esto

Creo que lo más eficiente, rápido y pequeño sería std::reverse