文件访问是一个很重要的性能瓶颈。
本文主要从以下几方面来提高文件访问的性能:
- 文件编程建议
- OX文件系统介绍
- 文件性能测试
- 文件内存映射mapping
- 文件目录迭代访问
- 解析域名
- 追踪文件变化
通用I/O建议
- 减少文件操作
- 减少文件访问次数,如每次读取长度【chunks】
- 执行顺序读写,替换seek。
- 避免零填充延迟【指的是文件在关闭的时候,会自动填充空数据,导致文件关闭延迟,空文件seek】
- 读比写便宜
- 尽量延迟访问文件,使用懒加载的意思
- 尽量不要缓存文件数据到内存,找到内存和文件缓存的平衡,特别哪些只使用一次的数据。
文件性能测试
- shark
- fs_usage
- sc_usage
文件内存映射
总体目标是减少磁盘与内存之间的数据传输,文件内存映射和应用共用内存空间。
文件映射在一下情况非常有效
- 多次访问一个大文件
- 小文件一次性全部读取,频繁访问
- 访问缓存文件的部分内存,必现读取文件的其他内容进内存。
不应该使用场景
- 你想要按顺序从头到尾读取一个文件,仅仅访问一次
- 非常大的文件【文件内存映射需要非常大的连续虚拟内存地址】
- 可移动磁盘的文件
- 网络文件
迭代目录
避免多次迭代目录,避免重复调用stat函数,迭代读取目录,系统会缓存大量的文件元数据。
追踪文件变化
iOS可以使用dispatch_source
1.添加属性
@property (nonatomic, strong) dispatch_source_t source;
2.开启监听
-
(void)startManager { [self startMonitorFile]; }
-
(void)startMonitorFile { //监听Document文件夹的变化 NSURL *directoryURL = [NSURL URLWithString:[SandBoxHelper docPath]]; //添加需要监听的目录 int const fd = open([[directoryURL path] fileSystemRepresentation], O_EVTONLY); if (fd < 0) { NSLog(@"Unable to open the path = %@", [directoryURL path]); return; } dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_VNODE, fd, DISPATCH_VNODE_WRITE, DISPATCH_TARGET_QUEUE_DEFAULT); dispatch_source_set_event_handler(source, ^() { unsigned long const type = dispatch_source_get_data(source); switch (type) { case DISPATCH_VNODE_WRITE: { PVRLog(@"Document目录内容发生变化!!!"); if (self.isConvenientFinished) { self.isConvenientFinished = NO; [self directoryDidChange]; } break; } default: break; } }); dispatch_source_set_cancel_handler(source, ^{ close(fd); }); self.source = source; dispatch_resume(self.source); }
3.在退出的时候,注销一下
- (void)stopManager { dispatch_cancel(self.source); }
网友评论