Pregunta

Estoy intentando optimizar un código que escribí para manejar varias capas de un protocolo de aplicación.Hice uso liberal del std::string clase, y se esforzó por la simplicidad en lugar de la optimización prematura.La aplicación es demasiado lenta y valgrind & profesor muestra que estoy dedicando mucho tiempo a copiar y construir cadenas a medida que un búfer se mueve hacia arriba a través de mi pila.

Me parece que, después de copiar caracteres del búfer del sistema al búfer de mi aplicación más bajo, debería poder evitar copiar más los datos:después de todo, no muta a medida que asciende en la pila.

El formato de mi protocolo es una "transmisión", que consta de uno o más archivos terminados en nueva línea. registros, cada uno de los cuales consta de varios archivos separados por tabulaciones campos, y terminado con un token especial.P.ej.

RECORD 1\tHAS\tTHESE\tFIELDS\nRECORD 2\tLOOKS\tLIKE\tTHIS\nEND-OF-TRANSMISSION\n

Este se ensamblaría en un solo std::string llamado input_buffer.

El procesamiento de una transmisión implica extraer una registro desde el búfer y pasándolo a la siguiente capa;extrayendo un vector de campos del registro y pasarlo a la siguiente capa;almacenar los campos en un mapa.En cada etapa, los datos se copian a medida que se asignan nuevas std::strings.

¿Es posible asignar una cadena constante de un índice a input_buffer y una longitud...sin que se haga ninguna copia?Por ejemplo, RECORD 2 comienza en el desplazamiento 26 y tiene 24 caracteres:

const std:string record (substr(input_buffer, 26), 24 );

No estoy familiarizado con las entrañas de un objeto de cadena, pero sus garantías de rendimiento parecen implicar que en algún lugar hay una secuencia de caracteres simple y casi indudablemente un puntero a la memoria de esos caracteres.¿Se podría inicializar ese puntero en la memoria que pertenece a otra cadena?

(Mi compilador es g++ 4.7, pero si esto es algo que requiere 4.8, también agradecería saberlo).

¿Fue útil?

Solución

Por lo que tengo entendido, parece un buen candidato para impulso::string_ref.simplemente harías boost::string_ref input(input_buffer); y luego pasar string_refEn su lugar, está en la pila.Lo único de lo que debe preocuparse es de mantener vivo el búfer original todo el tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top