Mi regla de dedo conjetura rendimiento es que eso depende de si usted es ascendente hacia la izquierda-ising un gran bloque de datos de una sola vez, o simplemente un valor:
Si hay un solo valor, entonces la sobrecarga de llamada de función probablemente arruinará la sobrecarga de byte-swaps innecesarios, y eso incluso si el compilador no optimiza los byte swaps innecesarios. Entonces, tal vez va a escribir el valor como el número de puerto de una conexión de socket, e intenta abrir o enlazar un socket, que toma una edad en comparación con cualquier tipo de manipulación de bits. Así que no te preocupes por eso.
Si es un bloque grande, entonces puede que le preocupe que el compilador no lo maneje. Haga algo como esto:
if (!is_little_endian()) {
for (int i = 0; i < size; ++i) {
vals[i] = swap_short(vals[i]);
}
}
O mire las instrucciones SIMD en su arquitectura que pueden hacerlo considerablemente más rápido.
Escriba is_little_endian()
utilizando el truco que desee. Creo que el que proporciona Robert S. Barnes es sólido, pero como normalmente se sabe para un objetivo determinado, ya sea grande o pequeño, quizás se deba tener un archivo de encabezado específico de la plataforma, que lo define como un macro evaluando ya sea a 1 o 0.
Como siempre, si realmente le importa el rendimiento, mire el ensamblaje generado para ver si se eliminó el código inútil o no, y mida las diferentes alternativas entre sí para ver qué es lo que realmente funciona más rápido.
no se preocupe por la pérdida de rendimiento. Si hace cosas redundantes (intercambiando un int dos veces) el compilador detectará y eliminará el código durante su fase de optimización. –
Lo que dijo Nils, pero un enfoque más cuidadoso es verificar primero el código generado en el nivel de optimización que puede pagar (si tiene problemas con la depuración, entonces uh-oh). Si se optimiza el intercambio doble, su problema de rendimiento se resuelve al instante. – MaR
¿El compilador realmente logrará optimizar esto? Supongo que si swap() y htons() son macros o funciones en línea, lo hará, pero de lo contrario? – anorm