Optimum arabellek boyutu birçok şeyle ilgilidir: dosya sistemi blok boyutu, CPU önbellek boyutu ve önbellek gecikmesi.
Çoğu dosya sistemi 4096 veya 8192 blok boyutlarını kullanacak şekilde yapılandırılmıştır. Teorik olarak, arabellek boyutunuzu disk bloğundan birkaç bayt daha fazla okuyacak şekilde yapılandırırsanız, dosya sistemiyle işlemler son derece verimsiz olabilir (örneğin, ara belleğinizi bir seferde 4100 bayt okuyacak şekilde yapılandırdıysanız, her bir okuma dosya sistemi tarafından 2 blok okuma gerektirir). Bloklar zaten önbellekte ise, RAM -> L3 / L2 önbellek gecikme süresini ödeyerek bitirirsiniz. Şanssızsanız ve bloklar henüz önbellekte değilse, disk-> RAM gecikmesinin de bedelini ödersiniz.
Bu yüzden çoğu arabellek boyutu 2 büyüklüğünde ve genellikle disk bloğu boyutundan daha büyük (veya bu değere eşit) olarak görülür. Bu, akış okumalarınızdan birinin birden çok disk bloğu okumasına neden olabileceği anlamına gelir - ancak bu okumalar her zaman tam bir blok kullanır - boşa giden okuma yok.
Şimdi, bu tipik bir akış senaryosunda biraz dengeleniyor çünkü diskten okunan blok, bir sonraki okumaya vurduğunuzda hala bellekte kalacak (sonuçta burada sıralı okumalar yapıyoruz) - böylece sarılıyorsunuz bir sonraki okumada RAM -> L3 / L2 önbellek gecikme fiyatını ödemek, ancak disk-> RAM gecikmesini değil. Büyüklük sırasına göre, disk-> RAM gecikmesi o kadar yavaştır ki, uğraşabileceğiniz diğer gecikmeleri hemen hemen batar.
Bu nedenle, farklı önbellek boyutlarında bir test çalıştırdıysanız (bunu kendim yapmadıysanız), muhtemelen önbellek boyutunun dosya sistemi bloğunun boyutuna kadar büyük bir etki bulacağından şüpheleniyorum. Bunun üstünde, işlerin oldukça hızlı bir şekilde dengeleneceğinden şüpheleniyorum.
Bir ton var aslında oldukça şaşırtıcı olan sistemin karmaşıklığı - koşullarına ve istisnalar burada (sadece L3 üzerindeki kolu almak -> L2 önbellek transferleri aklın almaz karmaşıktır ve her CPU türü ile değiştirir).
Bu, 'gerçek dünya' cevabına yol açar: Uygulamanız orada% 99 gibi ise, önbellek boyutunu 8192 olarak ayarlayın ve devam edin (daha da iyisi, performans üzerinde kapsüllemeyi seçin ve ayrıntıları gizlemek için BufferedInputStream kullanın). Disk verimliliğine büyük ölçüde bağımlı olan uygulamaların% 1'indeyseniz, uygulamanızı farklı disk etkileşim stratejilerini değiştirebilmeniz için hazırlayın ve kullanıcılarınızın test etmesine ve optimize etmesine (veya birtakım sonuçlara) ulaşmak için düğmeler ve kadranlar sağlayın kendini optimize etme sistemi).