可能重复:
How do you determine the ideal buffer size when using FileInputStream?
fread($file, 8192)
比fread($file, 10000)
更好还是更安全?为什么大多数例子都使用2的幂?
答案 0 :(得分:7)
请参阅this great accepted answer此问题:How do you determine the ideal buffer size when using FileInputStream?。
大多数文件系统都配置为使用4096或8192的块大小。理论上,如果配置缓冲区大小使得读取的磁盘块数比磁盘块多几个字节,那么使用文件系统的操作可能效率极低(即,如果您将缓冲区配置为一次读取4100个字节,则每次读取都需要文件系统进行2次块读取。如果块已经在缓存中,那么你最终会支付RAM的价格 - > L3 / L2缓存延迟。如果你运气不好而且这些块还没有在缓存中,那么你也需要支付磁盘价格 - > RAM延迟。
这就是为什么您看到大多数缓冲区的大小为2的幂,并且通常大于(或等于)磁盘块大小。这意味着您的一个流读取可能会导致多个磁盘块读取 - 但这些读取将始终使用完整的块 - 不会浪费读取。
虽然这个问题与Java有关,但答案却不是。此外,它几乎与语言无关。该答案涵盖了我所知道的有关缓冲区大小的所有因素。
答案 1 :(得分:2)
要么因为:
答案 2 :(得分:2)
操作系统在pages中分配内存,(通常为4k - 但有时为8k)。
在这种情况下,使用8192字节倍数的缓冲区大小可以实现更高效的内存分配(因为它也适用于4096字节的倍数)。
如果您要求13k的内存,无论如何都会使用16k,所以为什么不要求16k开始。
CPU指令集也经过优化,可以处理与某些边界对齐的数据,无论是32位,64位还是128位。使用与3位或5位或奇数位对齐的数据会增加额外的处理开销。
这不是特定于PHP,它在操作系统自己的内存管理之上使用Zend Memory Manager,并且可能预先分配更大的内存块并将内存管理的注意力从用户那里拿走。