Nasıl FileİnputStream kullanırken ideal arabellek boyutunu belirliyorsunuz?
Bir dosyadan bir Authentication (hash) yaratır, ve dosyaları (>bunu bir sürü yapmam gereken bir yöntem var = 100,000). Ne kadar büyük arabellek dosyaları performansını en üst düzeye çıkarmak için okurdu yapmalıyım?
Herkes temel kod aşina çoğu ne olur ne olmaz diye tekrar edeyim)
MessageDigest md = MessageDigest.getInstance( "SHA" );
FileInputStream ios = new FileInputStream( "myfile.bmp" );
byte[] buffer = new byte[4 * 1024]; // what should this value be?
int read = 0;
while( ( read = ios.read( buffer ) ) > 0 )
md.update( buffer, 0, read );
ios.close();
md.digest();
Verimi en üst düzeye çıkarmak için tampon ideal boyutu nedir? Bu sistem bağımlı olduğunu biliyorum, ve eminim onun işletim sistemi, Dosya sistemi,veBağımlı sabit disk, ve belki de bu karışımı diğer donanım/yazılım.
(Java biraz yeniyim, bu sadece benim bilmediğim bazı Java API çağrısı olabilir ki belirtmem gerekir.)
Düzenleme:Bir sürü tahmin ediyorum. o yüzden önceden bu kullanılan sistemler türlü bilmiyorum. (Bu nedenle Java kullanıyorum.)
Düzenleme:Yukarıdaki kod..catch the post küçük yapmaya çalışın gibi şeyler eksik
CEVAP
Optimum tampon: dosya sisteminin blok boyutu, CPU önbellek boyutu ve önbellek gecikme.
Çoğu dosya sistemleri 4096 veya 8192 blok boyutlarını kullanmak için yapılandırılır. Teorik olarak, eğer yapılandırma tampon boyutu yani sen Okuma bir kaç byte daha fazla disk blok işlemleri ile dosya sistemi olabilir son derece verimsiz (Yani eğer yapılandırılmış hangisini okumak 4100 bayt zaman, her okur gerektirir 2 blok okur tarafından dosya sistemi). Eğer bloklar zaten önbelleğinde, sonra RAM fiyatı - ^ ödeme rüzgar . L3/L2 önbellek gecikme. Şanssız ve bloklar önbellek henüz değilse, disk -^ bedeli ödersiniz . RAM gecikme de.
Bu en arabellekleri 2, ve daha genellikle daha büyük bir güç (veya) eşit olarak boy disk blok boyutunu görmek nedeni budur. Bu akışı okur biri birden çok disk bloğu okur neden olabilir - ama okur her zaman tam bir blok - hayır boşa okur kullanacak olanlar anlamına gelir.
Şimdi, bu uzaklık oldukça tipik bir akarsu senaryo çünkü bloke okuma disk oluyor hala hafıza zaman vurmak bir sonraki okuma (biz yaparken sıralı okuma burada, tüm sonra) - sen rüzgar ödeyerek RAM ->Bir sonraki L3/L2 önbellek gecikme bedeli okumak, ama değil disk->RAM gecikme. Büyüklük sırası bakımından, disk->RAM gecikme oldukça fazla ile ilgili olabilir herhangi bir diğer gecikme bataklık o kadar yavaş olur.
Bu yüzden, sanıyorum ki, eğer kaçtın testi ile farklı önbellek boyutu (bunu yapmıyorduk kendimi), sen-ecek büyük olasılıkla bulmak büyük bir darbe önbellek boyutu boyutu dosya sistemi blok. Yukarıda, olaylar çok çabuk seviye ortaya çıkaracağını düşünüyorum.
Bir vardırtonKoşulları ve özel durumlar burada sistemin karmaşıklığı aslında oldukça şaşırtıcı (sadece L3>ele alıyorsanız bu Transferler bogglingly karmaşık zihin ve her CPU tipi ile değiştirir L2 önbellek).
Bu yol için 'gerçek dünya' cevap: EÄŸer app gibi ™'u orada kümesi önbellek boyutu 8192 ve hareket (hatta daha iyi, seçim sarma üzerinde performans ve kullanım BufferedÄ°nputStream gizlemek detayları). Eger %1 uygulamalar son derece bağımlı disk veri akışı, el sanatları uygulama böylece takas farklı disk etkileÅŸim stratejileri ve saÄŸlamak düğmeleri ve aramalar için izin kullanıcılar için test ve optimize etmek (veya gelmek yukarıya ile biraz kendini optimize sistemi).
Nasıl tmux içinde geçmiş arabellek boy...
Nasıl C dosyasının boyutunu belirliyor...
Nasıl bir liste boyutunu almak için...
Nasıl rakamlar matplotlib ile çizilmiş...
Nasıl python ile dosya boyutunu kontro...