vector<char>和string、char*性能差异对比

来源:互联网 发布:neural style java 编辑:程序博客网 时间:2024/05/22 05:24

c++,经常用到缓存,但缓存如何定义呢,一般我们使用void* 或char *作为存储的基本类型,对的缓存的操作定义也有多种方式,本文就常用的几种方式做了一个测试对比,看看每种方式具有什么样的性能和特点。首先看看如下测试代码:

#define  NUM (100*10000)typedef basic_string<char> bstring;void teststring(){bstring bs;int nval=4;long begint= GetTickCount();for (int i=0;i<NUM;i++){bs.append((char*)&nval,sizeof(int));}long endt= GetTickCount();;printf("basic_string time:%d\n",(endt-begint));vector<int > vchar;begint= GetTickCount();for (int i=0;i<NUM;i++){vchar.push_back(nval);}endt= GetTickCount();;printf("vector time:%d\n",(endt-begint));string str;begint= GetTickCount();for (int i=0;i<NUM;i++){str.append((char*)&nval,sizeof(int));}endt= GetTickCount();;printf("str time:%d\n",(endt-begint));long maxlen=NUM*1;char *test=new char[maxlen];begint=GetTickCount();long len=0;for (int i=0;i<NUM;i++){if (len+sizeof(nval)>maxlen){maxlen=len+(len/i)*(NUM-i);test=(char*)realloc(test,maxlen);if (!test){return;}}memcpy(test+i*4,&nval,sizeof(int));len+=sizeof(int);}endt=GetTickCount();printf("char time:%d\n",(endt-begint));delete[] test;}


我们将int值当成4字节的字符存储在内存中,

运行测试结果如下

另NUM=10*10000

basic_string time:94
vector time:93
str time:94
char time:0

修改NUM=100*10000

basic_string time:889
vector time:920
str time:874
char time:31

其中:

  1. typedef basic_string<char> bstring; 模板类
  2. vector<char >容器类
  3. string str;动态分配
  4. char *test=new char[maxlen];字符数组,通过realloc进行动态分配内存
从上面测试结果看出

1、用传统的字符数组进行海量(百万、千万次以上)字符操作,它具有绝对的优势。

2、但是在数量级较小(如十万级别以下)的情况下,char虽然性能仍然胜出,但需要自己管理内存,bstring、string虽然性能不级char,但耗时已在十几毫秒左右,对性能影响不大,但bstring、string提供了丰富的字符串操作如查找、替换等,减轻了程序员的工作负担,同时安全性也大大提高。

3、vector用于内置类型,性能最低,不推荐他作为缓存的操作,一般用于复杂的结构体保存较为方便。




原创粉丝点击