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
其中:
- typedef basic_string<char> bstring; 模板类
- vector<char >容器类
- string str;动态分配
- char *test=new char[maxlen];字符数组,通过realloc进行动态分配内存
1、用传统的字符数组进行海量(百万、千万次以上)字符操作,它具有绝对的优势。
2、但是在数量级较小(如十万级别以下)的情况下,char虽然性能仍然胜出,但需要自己管理内存,bstring、string虽然性能不级char,但耗时已在十几毫秒左右,对性能影响不大,但bstring、string提供了丰富的字符串操作如查找、替换等,减轻了程序员的工作负担,同时安全性也大大提高。
3、vector用于内置类型,性能最低,不推荐他作为缓存的操作,一般用于复杂的结构体保存较为方便。