2012-01-05 16 views
29

Czy podczas czytania z InputStreams decydujesz jaki rozmiar użyć dla bajtu []?Jak decydujecie, jaki rozmiar bajtu [] należy użyć dla InputStream.read()?

int nRead; 
byte[] data = new byte[16384]; // <-- this number is the one I'm wondering about 

while ((nRead = is.read(data, 0, data.length)) != -1) { 
    ...do something.. 
} 

Kiedy używasz małego w porównaniu z dużym? Jakie są różnice? Czy liczba ma wynosić 1024? Czy robi to różnicę, jeśli jest to InputStream z sieci vs dysku?

Dzięki, nie mogę znaleźć jasnej odpowiedzi gdzie indziej.

+3

Zastanawiam się to samo pytanie dla C#. Przypuszczam, że to ta sama odpowiedź. Prawdopodobnie można uwzględnić ślad pamięci (im mniejszy jest chunck, tym mniejszy jest ślad pamięci). Innym czynnikiem jest rodzaj strumienia wejściowego ... Strumień sieciowy zajmie więcej czasu, aby wypełnić bufor w porównaniu ze strumieniem pamięci ... Otrzymasz mniej kontroli za pomocą dużego bufora. –

+1

Większe dane powinny przyspieszyć czytanie z szybkiego źródła (mniej iteracji), a z drugiej strony marnować miejsce w przypadku wolnych źródeł (prędkość jest zdominowana przez oczekiwanie, więc nie ma znaczenia, jak duża jest twoja pętla) – akappa

Odpowiedz

19

Większość ludzi używa mocy 2 do rozmiaru. Jeżeli bufor jest co najmniej 512 bajtów, to nie ma to większego znaczenia (< 20%)

Dla sieci optymalna wielkość może wynosić od 2 do 8 KB kB (rozmiar pakietu bazową jest zazwyczaj do ~ 1,5 kb) W przypadku dostępu do dysku najszybszy rozmiar może wynosić od 8 KB do 64 KB. Jeśli używasz 8K lub 16K, nie będziesz miał problemu.

Uwaga do pobierania plików sieciowych, prawdopodobnie zwykle nie używasz całego bufora. Marnowanie kilku KB nie ma większego znaczenia dla 99% przypadków użycia.

1

Za pomocą metody available() w klasie InputStream. Z Javadoc:

Zwraca liczbę bajtów, które można odczytać (lub pomijane) od Ten strumień wejściowy bez blokowania przez następny wywołującego sposobu tego strumienia wejściowego. Następny wywołujący może być tym samym wątkiem lub innym wątkiem.

3

W dużej mierze zależy to od ilości pamięci i ilości danych, które można odczytać. Nie chcesz blokować zbyt często, więc rozważ odpowiedź BenCole; z drugiej strony nie chcesz przetwarzać małego fragmentu danych, jeśli przetwarzanie jest wolniejsze niż rzeczywisty odczyt.

Osobiście próbuję użyć biblioteki i odciążam zadanie wyboru rozmiaru bufora dla autorów bibliotek. Potem obiecuję sobie, że nigdy nie przeczytam kodu bibliotecznego, bo to doprowadza mnie do szału.

3

W takiej sytuacji zawsze używam rozsądnej mocy 2, gdzieś w przedziale od 2K do 16K. Zasadniczo różne InputStreams mają różne wartości optymalne, ale nie ma łatwego sposobu na określenie wartości.

Aby ustalić optymalną wartość, musisz dowiedzieć się więcej o dokładnym typie InputStream, z którym masz do czynienia, a także o parametrach sprzętu, który obsługuje InputStream.

Niepokojące jest to prawdopodobnie przedwczesna optymalizacja.

Powiązane problemy