Mi programa C tenía muchas llamadas de función strstr. La biblioteca estándar strstr ya es rápida, pero en mi caso la cadena de búsqueda siempre tiene una longitud de 5 caracteres. Me lo reemplazó con una versión especial para ganar algo de velocidad:Versión optimizada de strstr (la búsqueda tiene longitud constante)
int strstr5(const char *cs, const char *ct) { while (cs[4]) { if (cs[0] == ct[0] && cs[1] == ct[1] && cs[2] == ct[2] && cs[3] == ct[3] && cs[4] == ct[4]) return 1; cs++; } return 0; }
La función devuelve un entero porque es suficiente para saber si ct ocurre en cs. Mi función es simple y más rápida que strstr estándar en este caso especial, pero estoy interesado en saber si alguien tiene algunas mejoras de rendimiento que podrían aplicarse. Incluso pequeñas mejoras son bienvenidas.
Resumen:
- cs tiene longitud de> = 10, pero lo contrario puede variar. La longitud se conoce antes (no se usa en mi función). Duración del CS es generalmente de 100 a 200.
- ct tiene una longitud de 5
- contenido de cadenas puede ser cualquier cosa
Editar: Gracias por todas las respuestas y comentarios. Tengo que estudiar y probar ideas para ver qué funciona mejor. Comenzaré con la idea de MAK sobre el sufijo trie.
¿Llamarás frecuentemente a la función con el mismo valor de cs? de ct? –
Valor de cs si frecuentemente es el mismo. ct cambia todo el tiempo. – armakuni
No puede nombrar válidamente su función strstr5(), la implementación reserva todos los nombres de funciones que comienzan con "str" seguido de una letra minúscula. – unwind