请教mmap的问题
时间:2010-07-21
来源:互联网
如下代码,去掉那行注释,执行速度会慢300倍。前后区别就是把一个文件mmap了两次,性能差距这么大,mmap到底做了什么工作呢?
- int main(int argc, char **argv){
- if(argc != 2){
- printf("usage: %s file_name\n",argv[0]);
- return EXIT_FAILURE;
- }
-
- char *file_name = argv[1];
- struct stat st;
- size_t file_len = 0;
- if(stat(file_name, &st) < 0){
- printf("The file [%s] not exist or not readable!\n",file_name);
- return EXIT_FAILURE;
- }
- file_len = st.st_size;
- int fd_map = open(file_name,O_RDWR);
- char *map_ro = (char*)mmap(0, file_len, PROT_READ, MAP_PRIVATE, fd_map, 0);
- char *map_rw = (char*)mmap(0, file_len, PROT_READ, MAP_PRIVATE, fd_map, 0);
- char c = '0';
- size_t i = 0;
- for(i=0;i<file_len; i++){
- c=map_ro[i];
- // c=map_rw[i];
- }
- munmap(map_ro,file_len);
- munmap(map_rw,file_len);
- close(fd_map);
- return EXIT_SUCCESS;
- }
作者: KennyHIT 发布时间: 2010-07-21

作者: kgn28 发布时间: 2010-07-21
不是吧,两者应该都是读内存吧。同时谢谢楼上的回答。我也觉得发在本版不是很合适,不过有两个原因,1是觉得可能涉及到内核的一些原理,2是本版高手多。

作者: KennyHIT 发布时间: 2010-07-21
第二次的应该是查找内存后再读内存
LZ试着操作文件的不同部分,然后再统计一下时间
看看有没有什么变化
作者: openspace 发布时间: 2010-07-21
另外,不管是直接read,还是mmap后读内存,本质上都是一样的,都是从磁盘或者文件cache去读的。
作者: kouu 发布时间: 2010-07-21
去掉注释前:
$time ./detect_vm_layout kk
real 0m0.030s
user 0m0.026s
sys 0m0.004s
去掉注释后:
$time ./detect_vm_layout kk
real 0m7.816s
user 0m7.806s
sys 0m0.009s
每次执行都是两遍以上后的结果
文件kk的大小9兆多一点。即使在一般的pc机上cp一个十兆的文件也用不了7秒吧。
应该不是读硬盘的事,希望大家帮忙解答一下。
作者: KennyHIT 发布时间: 2010-07-21
另外,不管是直接read,还是mmap后读内 ...
kouu 发表于 2010-07-21 21:43
不是吧,我的系统是Red Hat Enterprise Linux AS release 4 (Nahant Update 6),你用的什么系统?
作者: KennyHIT 发布时间: 2010-07-21
- for(i=0;i<file_len; i++){
- c=map_ro[i];
- c=map_rw[i];
- }
- for(i=0;i<file_len; i++){
- c=map_ro[i];
- }
- for(i=0;i<file_len; i++){
- c=map_rw[i];
- }
$time ./detect_vm_layout kk
real 0m0.058s
user 0m0.047s
sys 0m0.011s
只是原来的两倍时间。
作者: KennyHIT 发布时间: 2010-07-21
是我错了,没仔细看你的程序。
我试了一下,30和24内核,读2MB文件,运行时间上都没有区别。
不过,应该考虑的问题是,你测试的时候,如果两次测试间隔时间较近,系统又是比较空闲,那么,第一次map之后,由于已经把文件读上来,那么第二次(去掉注释再编译)测试的时候,对应文件的inode->address_space的基树里面已经有磁盘的页缓冲了,不需要再读磁盘了,所以测试运行时间会不一样。不知道你测试的时候map多大的文件?
作者: kgn28 发布时间: 2010-07-21
是我错了,没仔细看你的程序。
我试了一下,30和24内核,读2MB文件,运行时间上 ...
kgn28 发表于 2010-07-21 22:16
我去掉注释后,反而慢300倍的时间,文件大小是9兆,内核版本是2.6.9-67.ELsmp ,64位的cpu
作者: KennyHIT 发布时间: 2010-07-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28