1 现象:问题描述
在一次版本测试过程中发现:话单处理过程中的速度比较慢,并且在加载AD数据时耗费大量的内存,加载7,000,000的AD数据大概消耗了600多M的内存。
2 关键过程:根本原因分析
经代码走读,发现代码中大量使用标准库中的string,并且采用string来保存单条的AD数据。由于string的实现中会预先分配一块很大的空间,并且在string对象的生存期需调用string的构造函数和析构函数,这些操作都会很耗时间。如果频繁、大量的进行这样的操作,将会对性能有很大的影响。
比如如下的测试代码中:
#include
#include
#include
int main(int argc, char* argv[])
{
timeb begintime,endtime;
ftime(&begintime);
for(int i = 0;i<10000000;i++)
{
std::string stringTest = "123456789";
}
ftime(&endtime);
printf("Time used %f s!\n", (endtime.time*1000 + endtime.millitm - begintime.time*1000 - begintime.millitm)/1000.0);
return 0;
}
对string进行10,000,000的赋值操作,需要17.469秒。
3 结论:解决方案及效果
可以用字符数组来代替string。比如上述的测试代码如果将:
std::string stringTest = "123456789";
改为:
char charTester[64];
strcpy(charTester,"123456789");
在同一台机器上进行10,000,000的字符串拷贝操作,仅需0.156秒,性能相差110倍!同时加载AD数据后内存的使用量仅为250M。
4 经验总结:预防措施和规范建议
使用string可以很方便的管理字符串,但在方便的同时需付出性能代价。对于程序中的关键代码段的实现中,需权衡效率和易用性两者之间的关系。
注意:不同的stl库的对string的实现可能会略有不同,实际使用中需区别对待。
5 备注
6 考核点
string的使用
7 试题
对于标准库中的string的使用,下面哪个说法是正确的:(C)
A. string的使用非常方便,应该在所有的地方都使用。
B. string的使用会带来性能的下降,不应该在程序中使用string。
C. 对于程序中的关键代码,特别是经常执行的代码段需考虑string在性能上的不足,而对于一般的代码可以充分利用string带来的便利性。
D. 以上说法都不对
阅读(286) | 评论(0) | 转发(0) |