использовать строку или поток? - PullRequest
2 голосов
/ 05 мая 2011

Мне нужно постепенно построить строку, и я пытаюсь найти лучший способ сделать это.Максимум, до которого он может вырасти, составляет около 10 тыс., И, следовательно, он планировал сделать что-то вроде этого:

const unsigned long long configSize = 10240; //Approximation
void makeMyConfig() {
   std::string resp;
   std::string input;
   resp.reserve(configSize);
   while ( getInput(input) ) {
     resp += input;
   }

   if ( resp.length > configSize ) 
      log << "May need to adjust configSize. Validate" << endl;

   if (!sendConfig(resp)){
      log << "Error sending config" << endl;
   }
}

getInput может читать из файла / tcp conn или ftp и определяется во время выполнения.Он получает const char * и помещает его в строку (которую я могу избежать, но оставил ее для удобства)

Однако я слышал, что есть очень эффективный способ работы со строковыми потоками, но не уверен, каксделать.Цените любые идеи.

Ответы [ 2 ]

13 голосов
/ 05 мая 2011

выглядит довольно здорово для меня.

  • Вы предварительно выделяете буфер, избегая текущих выделений и копий.
  • У вас уже есть его реализация

Не оптимизируйте, пока вына самом деле имеют проблемы с производительностью и могут измерять любые изменения производительности.Вы можете сделать это еще хуже, не осознавая!

0 голосов
/ 05 мая 2011

Для всех, кто интересуется разницей между резервированием и не резервированием строки, рассмотрите следующий код:

#include <iostream>
#include <string>
#include <ctime>
using namespace std;

const int BIG = 10000000;
const int EXTRA = 100;

int main() {

    string s1;
    s1.reserve( BIG );

    clock_t t = clock();
    for ( int i = 0; i < BIG + EXTRA; i++ ) {
        s1 += 'x';
    }
    cout << clock() - t << endl;

    string s2;
    t = clock();
    for ( int i = 0; i < BIG + EXTRA; i++ ) {
        s2 += 'x';
    }
    cout << clock() - t << endl;
}

В первом случае строка зарезервирована, во втором - нет.Это дает время:

60
78

для g ++, скомпилированного с -O2.

...