数组中,连续内存和不连续内存的分配、访问速度

数组中,连续内存和不连续内存的分配、访问速度

测试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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值