# Best Practice of Downloader (下载器最佳实践) * 优化V1 - 多线程下载 - 边下载边写文件,边下载边计算摘要md5_append, 并将md5_state```状态文件```实时写入磁盘 - 下载完成摘要也就计算完成md5_finish * 优化V2 - 下载过程中的```数据文件```和```状态文件```都可以用内存映射文件 - 内存映射文件可以提前分配好磁盘空间,写入过程中不再需要磁盘驱动器不断地扩充文件大小,相当于我们使用```std::vector```过程中,如果已经知道数据大小,可提前```reserve```内存,避免GC - 状态文件包含字段: - 已下载字节数 4字节 - hash摘要状态,例如md5_state 88字节 - 多路io复用同时下载多个文件,提高CPU利用率,无需开过多线程,对于移动端最大2~4线程就够用,基本可以同时下载10个以上小文件,同时对于小文件也可以更加充分地利用传输带宽
Best Practice of Downloader (下载器最佳实践)
状态文件实时写入磁盘数据文件和状态文件都可以用内存映射文件std::vector过程中,如果已经知道数据大小,可提前reserve内存,避免GC