The slurp is not as ravenous as its nickname suggests. Although it appears even during debug to slurp in one go, behind the scenes the <> operator is performing I/O system calls that are consistent with reading by delimiter; that in spite of your 'local $/'. On the other hand, read's buffers are of an optimised size. As a rule, the larger the buffer size of each actual I/O system call, the fewer such calls have to be performed and the more efficiently the whole file is read in.