Pergunta

Estou tentando otimizar algum código que escrevi para lidar com várias camadas de um protocolo de aplicativo.Fiz uso liberal do std::string classe e buscou a simplicidade em vez da otimização prematura.O aplicativo é muito lento e valgrind & gprof mostre que estou gastando um tempo significativo na construção de strings à medida que um buffer sobe na minha pilha.

Parece-me que, depois de copiar caracteres do buffer do sistema para o buffer de aplicativo mais baixo, devo evitar mais copiar os dados:afinal, ele não sofre mutação à medida que sobe na pilha.

Meu formato de protocolo é uma "transmissão", que consiste em uma ou mais terminadas em nova linha registros, cada um consistindo em vários separados por tabulação Campos, e encerrado com um token especial.Por exemplo.

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

Este seria montado em um único std::string chamado input_buffer.

O processamento de uma transmissão envolve a extração de um registro do buffer e passando para a próxima camada;extraindo um vetor de Campos do registro e passando para a próxima camada;armazenando os campos em um mapa.Em cada estágio, os dados são copiados à medida que novas std::strings são alocadas.

É possível alocar uma string const de um índice em input_buffer e um comprimento ...sem que nenhuma cópia seja feita?Por exemplo, RECORD 2 começa no deslocamento 26 e tem 24 caracteres:

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

Não estou familiarizado com as entranhas de um objeto string, mas suas garantias de desempenho parecem implicar que em algum lugar existe uma sequência simples de caracteres e quase sem dúvida um ponteiro para a memória desses caracteres.Esse ponteiro poderia ser inicializado na memória pertencente a outra string?

(Meu compilador é g++ 4.7, mas se isso requer algo que requer 4.8, eu gostaria de saber disso também.)

Foi útil?

Solução

Pelo que entendi, parece um bom candidato para impulso::string_ref.Você simplesmente faria boost::string_ref input(input_buffer); e depois passar string_refem vez disso, aumente a pilha.A única coisa com que você precisa se preocupar é manter o buffer original ativo o tempo todo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top