硬盘写入和内存写入到底有多大的差距
2015-06-08 12:31
387 查看
分别以1倍size,10倍size,100倍size写入同样大小的数据,分别测试大文件写入和内存拷贝。
tfwrite woaoniyoujifen,yueliangdaibiaowodexin!
small write 100w times begin ...
begin sec[1433735551], microsec[956743]
small write 100w time over.
end sec[1433735553], microsec[550436]
Large write 10w times begin ...
begin sec[1433735553], microsec[550470]
Large write 10w times end.
end sec[1433735553], microsec[719068]
SuperLarge write 1w times begin ...
begin sec[1433735553], microsec[719078]
SuperLarge write 1w times end.
end sec[1433735553], microsec[782787]
begin to 100w small strcpy
begin sec[1433735553], microsec[801839]
100w small strcpy over .
end sec[1433735553], microsec[879082]
begin to 10w large strcpy
begin sec[1433735553], microsec[885847]
10w Large strcpy over .
end sec[1433735553], microsec[930263]
begin to 1w Superlarge strcpy
begin sec[1433735553], microsec[936975]
1w SuperLarge strcpy over .
end sec[1433735553], microsec[978766]
从测试结果看出,在大文件写入上内存和硬盘的差距只有1倍。应该是硬盘和内存的IO效率差别并不是太大,文件写入和内存写入真正拉开的是随机小文件的读写上,硬盘需要寻道,内存地址直接访问。 至于1倍size的文件写入和10倍size文件写入有8倍差距,可能是和频繁的内核切换有关。
上面一组memcpy而不是strcpy+strlen的内存处理方式做一下数据,测试和上面一样。
i = 0;
offset = 0;
size = strlen(szSuperLarge);
while(i++ < 10000)
{
memcpy(szSuperLargeBuff+offset, szSuperLarge, size);
offset += size;
//strcpy(szSuperLargeBuff+offset, szSuperLarge);
//offset += strlen(szSuperLarge);
}
begin to 100w small strcpy
begin sec[1433743026], microsec[935164]
100w small strcpy over .
end sec[1433743026], microsec[991945]
begin to 10w large strcpy
begin sec[1433743026], microsec[998639]
10w Large strcpy over .
end sec[1433743027], microsec[18547]
begin to 1w Superlarge strcpy
begin sec[1433743027], microsec[25287]
1w SuperLarge strcpy over .
end sec[1433743027], microsec[33669]
strcpy+strlen内存复制的三组时间,单位毫秒
77243
44416
41791
memcpy+size的三组时间,单位毫秒
56781
19908
8382频繁小size内存memcpy比strcpy+strlen节约了不到1/3的时间,而大内存拷贝时竟节约了接近4/5的时间。
结论:内存操作明显优于文件操作,而整块内存拷贝又明显优于字符拷贝。
字符串拷贝优化的必要性
以strcpy的方式
单次拷贝38字节,拷贝100次,耗时7.7ms。
单次拷贝3800字节,拷贝1次,耗时4.1ms。
以memcpy的方式
单次拷贝38字节,拷贝100次,耗时5.7ms。
单次拷贝3800字节,拷贝1次,耗时0.8ms。
高性能程序尽可能避免字符串重复拷贝,需要拷贝的时候大size字符串拷贝适合使用memcpy,小size字符串拷贝无明显讲究。
tfwrite woaoniyoujifen,yueliangdaibiaowodexin!
small write 100w times begin ...
begin sec[1433735551], microsec[956743]
small write 100w time over.
end sec[1433735553], microsec[550436]
Large write 10w times begin ...
begin sec[1433735553], microsec[550470]
Large write 10w times end.
end sec[1433735553], microsec[719068]
SuperLarge write 1w times begin ...
begin sec[1433735553], microsec[719078]
SuperLarge write 1w times end.
end sec[1433735553], microsec[782787]
begin to 100w small strcpy
begin sec[1433735553], microsec[801839]
100w small strcpy over .
end sec[1433735553], microsec[879082]
begin to 10w large strcpy
begin sec[1433735553], microsec[885847]
10w Large strcpy over .
end sec[1433735553], microsec[930263]
begin to 1w Superlarge strcpy
begin sec[1433735553], microsec[936975]
1w SuperLarge strcpy over .
end sec[1433735553], microsec[978766]
从测试结果看出,在大文件写入上内存和硬盘的差距只有1倍。应该是硬盘和内存的IO效率差别并不是太大,文件写入和内存写入真正拉开的是随机小文件的读写上,硬盘需要寻道,内存地址直接访问。 至于1倍size的文件写入和10倍size文件写入有8倍差距,可能是和频繁的内核切换有关。
上面一组memcpy而不是strcpy+strlen的内存处理方式做一下数据,测试和上面一样。
i = 0;
offset = 0;
size = strlen(szSuperLarge);
while(i++ < 10000)
{
memcpy(szSuperLargeBuff+offset, szSuperLarge, size);
offset += size;
//strcpy(szSuperLargeBuff+offset, szSuperLarge);
//offset += strlen(szSuperLarge);
}
begin to 100w small strcpy
begin sec[1433743026], microsec[935164]
100w small strcpy over .
end sec[1433743026], microsec[991945]
begin to 10w large strcpy
begin sec[1433743026], microsec[998639]
10w Large strcpy over .
end sec[1433743027], microsec[18547]
begin to 1w Superlarge strcpy
begin sec[1433743027], microsec[25287]
1w SuperLarge strcpy over .
end sec[1433743027], microsec[33669]
strcpy+strlen内存复制的三组时间,单位毫秒
77243
44416
41791
memcpy+size的三组时间,单位毫秒
56781
19908
8382频繁小size内存memcpy比strcpy+strlen节约了不到1/3的时间,而大内存拷贝时竟节约了接近4/5的时间。
结论:内存操作明显优于文件操作,而整块内存拷贝又明显优于字符拷贝。
字符串拷贝优化的必要性
以strcpy的方式
单次拷贝38字节,拷贝100次,耗时7.7ms。
单次拷贝3800字节,拷贝1次,耗时4.1ms。
以memcpy的方式
单次拷贝38字节,拷贝100次,耗时5.7ms。
单次拷贝3800字节,拷贝1次,耗时0.8ms。
高性能程序尽可能避免字符串重复拷贝,需要拷贝的时候大size字符串拷贝适合使用memcpy,小size字符串拷贝无明显讲究。
相关文章推荐
- PHP关于表单提交 后 post get分页
- Struts2前台后台的数据传递 (转)
- mysql中文显示为问号?的解决方法
- 洗纸牌算法
- [LeetCode] Rectangle Area
- python网络编程
- 学习linux驱动经典书籍
- Exchange 2013 中客户端和邮件流的网络端口
- [工具使用] SOAP UI 测试
- android中图片压缩以及图片旋转的方法
- nodejs - 如何完全更新
- curses.h学习笔记
- kaptcha验证码使用
- 杭电ACM2022java做法
- 怎样配置EBS Mobile 客户端
- vim行首加入某字符
- Vim删除不包含指定字符串的行
- 根据字段去重查询所有数据
- 统计字符串中每个字母出现的次数。
- HangOver