2011-05-05 36 views
2

我需要逐步构建一个字符串,并试图找到最好的方法来做到这一点。它可以长到最大为10K左右,因此正打算做这样的事情:使用字符串或流?

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康恩或ftp阅读并在运行时决定的。它接收到const char *并将它放入一个字符串中(我可以避免但为了方便而离开它)

但是,我听说有一种处理字符串流的高效方法,但不知道该怎么做。欣赏任何见解。

+0

不要忘记你的'length'调用的括号:'if(resp.length()> configSize)' – 2011-05-05 13:47:41

回答

13

对我来说看起来很棒。

  • 您正在预先分配缓冲区,避免正在进行的分配和副本。
  • 你已经拥有它实现

不要优化,直到你真正有性能问题,可以测量任何性能变化。如果没有意识到,你可能会变得更糟!

+0

+1:我开始使用'stringstream'来解决一个解决方案,事实证明它是更冗长,没有可识别的好处。 – 2011-05-05 13:42:12

+0

+1,不要过多考虑这个问题。甚至在问题中的解决方案可能是矫枉过正的,也许只是让'string'处理内存,除非字符串倾向于位于频谱的大端。 – 2011-05-05 13:44:02

+0

谢谢,我会坚持现在的! – Kiran 2011-05-05 14:03:35

0

对于任何感兴趣的预留和未预留的字符串之间的差,考虑下面的代码:

#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 ++。

+0

如果您保留“BIG + EXTRA”,即足够的空间,那么该怎么办? – 2011-05-05 15:19:15

+0

@Steve我得到58 78(或其附近),但我试图模拟OP的问题,他不知道输入是多大。 – 2011-05-05 15:26:33

+0

有趣的是,知道估计是否真的是一个上限并不重要。 – 2011-05-05 15:28:18