C++

C++怎么提高string操作的性能?

TheHuPost newsletter上线了, 欢迎大家订阅! 
对C++, Java,JavaScript,Python等编程语言有兴趣的,也可以看看编程语言.
也欢迎大家来论坛与我讨论

C++怎么提高string操作的性能?

问题:

假设希望每次读取一个字符写入一个string中,且已知最少读取100个字符,考虑应该如何提高程序的性能?(C++ Primer 9.37 习题)

答:

以下代码执行结果揭示了string 内存分配策略,string 的内存分配和vector一样, 默认情况下capacity 都是以2的n 次方增长的,  详细内容见前面的一篇“vector的自增长及顺序容器的选择

void printSizeInfo(string & s)
{
    cout<<"size: "<<s.size()<<endl;
    cout<<"capacity: "<<s.capacity()<<endl;
    cout<<"maxsize: "<<s.max_size()<<endl;
    cout<<endl;
}



int main(int argc, char* argv[])
{
   string s;
   printSizeInfo(s);

   for(string::size_type i = 0 ; i< 50 ; ++i)
   {
       s.push_back(i);
       printSizeInfo(s);
   }

   return 0;
}

了解了string 的内存分配策略, 知道如果添加100个元素, 这string的capacity 需要增加到128 , 这需要8次重新分配内存的过程

故提高性能的方式是 通过reserve() 指定第一个就分配128 , 这样添加100 个元素只有1次内存分配的过程

验证:

//100 个元素执行时间太短,不好统计

1.  没有reserver ,直接添加1000个元素

代码:

int main(int argc, char* argv[])
{
   string s;


   for(string::size_type i = 0 ; i< 1000 ; ++i)
   {
       s.push_back(i);

   }

   return 0;
}

执行时间:  0.031s

2.  有reserve 操作

代码:

int main(int argc, char* argv[])
{
   string s;
   s.reserve(1024);

   for(string::size_type i = 0 ; i< 1000 ; ++i)
   {
       s.push_back(i);

   }

   return 0;
}

执行时间: 0.016


假设希望每次读取一个字符写入一个string中,且已知最少读取100个字符,考虑应该如何提高程序的性能?

1. 了解string 对象内存分配策略

了解了string 的内存分配策略, 知道如果添加100个元素, 这string的capacity 需要增加到128 , 这需要8次重新分配内存的过程

2. 性能优化方案

提高性能的方式是 通过reserve() 指定第一个就分配128 , 这样添加100 个元素只有1次内存分配的过程

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top