数组中,连续内存和不连续内存的分配、访问速度
测试char数组和字符串类string在原始数组中的表现
(1)声明两个数组
//字符数组
struct StFourChar
{
char name[4];
};
//string
struct StFourString
{
string name;
};
(2)第一个数组耗时
初始化代码如下:
int64_t nStartTime = GetNow();
StFourChar arrStChar[100];
for (int i = 0; i < 10000; ++i)
{
memset(arrStChar+i, 0, sizeof(StFourChar));
strncpy(arrStChar[i].name, sTemp, 3);
}
int64_t nEndTime = GetNow();
cout << "初始化原始数组耗时(us):" << nEndTime - nStartTime << endl;
访问代码如下:
nStartTime = GetNow();
for (int i = 0; i < 10000; ++i)
{
strncpy(sTemp, arrStChar[i].name, 3);
}
nEndTime = GetNow();
cout << "访问原始数组耗时(us):" << nEndTime - nStartTime << endl;
修改数据:
nStartTime = GetNow();
for (int i = 0; i < 10000; ++i)
{
strncpy(arrStChar[i].name, sModi, 3);
}
nEndTime = GetNow();
cout << "修改原始数组耗时(us):" << nEndTime - nStartTime << endl;
(3)第二个数组耗时
初始化的代码如下:
nStartTime = GetNow();
StFourString arrStString[10000];
for (int i = 0; i < 10000; ++i)
{
arrStString[i].name.assign(sTemp);
}
nEndTime = GetNow();
cout << "初始化String数组耗时(us):" << nEndTime - nStartTime << endl;
访问代码如下:
nStartTime = GetNow();
for (int i = 0; i < 10000; ++i)
{
strncpy(sTemp, arrStString[i].name.c_str(), 3);
}
nEndTime = GetNow();
cout << "访问String数组耗时(us):" << nEndTime - nStartTime << endl;
修改数据:
nStartTime = GetNow();
for (int i = 0; i < 10000; ++i)
{
arrStString[i].name.assign(sModi);
}
nEndTime = GetNow();
cout << "修改原始数组耗时(us):" << nEndTime - nStartTime << endl;
结果分析
初始化原始数组耗时(us):30
访问原始数组耗时(us):55
修改原始数组耗时(us):33
初始化String数组耗时(us):130
访问String数组耗时(us):54
修改String数组耗时(us):82
结果显示:非连续内存的数据初始化耗时是连续内存的4倍以上,访问速度没有差别,修改耗时是连续内存的两倍多。
可以看出CPU缓存对连续内存的缓存效果和寻址效果优于非连续内存。
在高频系统中的字符串应用
在高频系统中有大量对字符串以及字符串容器类的操作,因此在高频开发中应遵守以下规则:
(1)非临时的字符串都用固定长度的字符数组表示,如char InstrumentID[32],而不是string InstrumentID;
(2)使用连续内存的的原始数组、array、vector,不要使用不连续的queue或list;