Pracuję nad aplikacją na Androida, w której muszę, tak dokładnie, jak to możliwe, zmierzyć szybkość pobierania bieżącego połączenia. Oto najlepsza metoda, jaką udało mi się znaleźć do tej pory (w zasadzie uruchamiam programator, zaczynam pobierać dystrybucję Linuksa z szybkiego serwera, pobieram około 200 kilobajtów, zatrzymuję licznik czasu i sprawdzam czas, który upłynął oraz pobrano całkowite bajty):Pomiar prędkości pobierania z Java/Androidem
try{
InputStream is = new URL("http://www.domain.com/ubuntu-linux.iso").openStream();
byte[] buf = new byte[1024];
int n = 0;
startBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/
startTime = System.nanoTime();
while(n<200){
is.read(buf);
n++;
}
endTime = System.nanoTime();
endBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/
totalTime = endTime - startTime;
totalBytes = endBytes - startBytes;
}
catch(Exception e){
e.printStackTrace();
}
Po tym czasie wystarczy podzielić liczbę bajtów przesłanych przez czas wykonania, a prędkość pobierania zostanie podana w bps.
Pytania: 1. Czy ta metoda będzie dokładna? 2. Czy znasz lepszy?
Wielkie dzięki.
W ten sposób skonfigurujesz to teraz, nie będzie to dokładne. 'InputStream.read' nie gwarantuje pełnego wypełnienia bufora. Musisz sprawdzić wartość zwracaną, aby zobaczyć, ile "bajtów" zostało faktycznie przeczytanych. – Jeffrey
@Jeffrey, nie przeczytałeś dokładnie kodu. Nie liczę na read(), aby uzyskać liczbę bajtów. Otrzymuję go bezpośrednio z systemu operacyjnego za pomocą funkcji getTotalRxBytes(). –
Ahh, moje złe. Rzeczywiście przejrzałem tę część. Twoje rozwiązanie będzie mniej lub bardziej dokładne. – Jeffrey