Um buffer, pelo que entendi, é mais útil quando as taxas em que um produtor e um consumidor produzem ou consomem dados de forma otimizada são diferentes.
Por exemplo, um programa pode gravar 8 bytes de dados em um arquivo por vez. Para o disco que está sendo gravado, pode ser ideal gravar 4 KiB de dados de cada vez. Para pedaços significativamente menores, a sobrecarga envolvida na gravação no disco pode se tornar maior do que o tempo gasto pelo disco para realmente gravar os dados (de modo que 512 * T_8b > T_4KiB). Assim, ter um buffer entre reunir 4 KiB blocos de dados e escrevê-los de uma só vez aumentaria muito o desempenho. Veja, por exemplo: Por que dd leva muito tempo? , onde a solução mais simples é usar um tamanho de buffer maior. (Claro, meus números aqui são puramente por exemplo. Números reais adequados para discos modernos podem ser muito diferentes.)
Um cache é ortogonal ao buffer. Tanto o cache quanto o buffer são feitos para evitar acessos extras desnecessários de uma fonte lenta (disco, rede, etc.). Mas um cache funciona eliminando leituras e gravações duplicadas salvando os resultados para reutilização, enquanto um buffer funciona eliminando leituras e gravações repetidas e seqüenciais agrupando-as. Uma visão simplista:
- quando você lê o mesmo local n vezes, apenas o primeiro chega ao disco, o restante vem do cache
- quando você escreve no mesmo local n vezes, apenas o último é realmente gravado