我建了两个程序,一个使用malloc
,另一个使用mmap
.使用的执行时间mmap
远远少于使用malloc
.
我知道,例如,当您使用时,mmap
请避免对系统进行读/写调用.并且内存访问较少.
但在使用时,还有没有其他原因的优势mmap
超过malloc
?
非常感谢
Jef*_*rth 12
mmap实际上并没有将文件加载到内存中,因此加载速度会更快,但编辑速度会慢一些.
另一点是mmap不使用任何内存,但它占用了地址空间.在64位机器上,大多数内存地址空间都没有内存,所以你可以加载大量的文件,比如5gb,你不想要malloc.
小智 10
看看大家,与普通人相反,mmap确实是一个类似于malloc的内存分配函数.
mmaped文件是它的一个用途..你可以使用它作为内存分配函数传递-1作为文件描述符..
所以...常见的用法是将malloc用于微小物体,将mmap用于大型物体.
这是一个很好的策略..
我使用alloca()来仅为函数范围变量..
小智 9
malloc和mmap有时都很慢.这主要取决于使用模式:
mmap:内核分页子系统以页面大小为单位工作.这意味着,如果您想从文件中读取整个页面并希望重复这样做(良好的本地化),那么mmap就可以了.相反,如果您映射该5 Gb文件并进行分散访问,您将拥有很多内核交换页面.除了实际的I/O之外,页面管理还需要一些时间.如果您担心延迟,请避免使用此访问模式,因为Linux页面回收机制往往是突发性的并且会导致明显的滞后,并且缓存中毒会降低其他进程的速度.
malloc:当你需要不是以页面大小为单位的内存时,这很好.但你不能做像mlock()这样的事情.就I/O而言,速度在很大程度上取决于您的操作方式.fread/fwrite可以在幕后映射页面,或者在用户空间中进行缓冲.本地化访问速度相当快.读/写直接通过内核,因此小的分布式访问仍会因缓存未命中而导致I/O,但从kernel-> userspace传输的实际数据会略少.我不知道这是否可以衡量.
除非mlock()'ed,否则用户页面可以随时换出/写回.这也需要时间.因此,在内存很少的系统上,映射最少内存的变体将获胜.对于Linux内核,每个系统都有太少的内存,因为未使用的页面用于缓存I/O,如果内存使用或I/O突发,内核可能需要花费大量时间才能使它们可用.