2

Really confused with bandwidth calculation formula.
Referring to the bandwidth detection question Check the bandwidth rate in Android i am trying to calculate bandwidth as following.

long startTime = System.currentTimeMillis();
HttpResponse response = httpclient.execute(httppost);
HttpEntity httpEntity = response.getEntity();
long contentLength = httpEntity.getContentLength();
long endTime = System.currentTimeMillis();
float bandwidth = contentLength / ((endTime-startTime) / 1000); // In the refereed question it is "((endTime-startTime) * 1000)" don't know why multiplication. 

What i need is current bandwidth in bits (not bytes or kbytes). I don't know using above formula if it is calculating bandwidth in bytes or bits.

also if download time is 0 seconds then what should be the bandwidth is it downloaded content length. can someone please suggest correct formula to calculate bandwidth in bits.

4

4 に答える 4

5

まず、精度を上げるために、帯域幅を変数1000.0に割り当てるため、を使用して秒に変換する必要があります。float

float bandwidth = (contentLength / (endTime-startTime)) / 1000.0;

contentLengthはバイト単位で測定されるため、ビット(Kb、Mbなど)に変換する必要があります。各バイトには8ビットがあるため、contentLength*8バイトをビットに変換します。

Kilo-> Mega-> Giga-> ...ビット単位のスケール変換は、1000ビットをメガビットに変換するには。による除算が必要なオーダーです1000*1000。これらすべてを組み合わせると、次のようになります。

int bits = contentLength * 8;
int megabits = contentLength / (1000*1000); //Megabits
float seconds = endTime-startTime / 1000.0;
float bandwidth = (megabits / seconds);  //Megabits-per-second (Mbps)

編集#1:帯域幅がバイト/時間(たとえばKB /秒など)で表される場合、スケール変換は次のオーダーになります1024

int bytes = contentLength;
int kilobytes = contentLength / 1024; //Kilobytes

編集#2:帯域幅の観点から話すときの「メガ」や「キロ」などの定義は、私が認識しているやや曖昧な場合があります。多くの場合、 1024(2 10)と1000(10 3)は同じ意味で使用されることがあります(ほとんどの場合、事故)。多くの場合1024、コンピュータのメモリストレージスペースは2進数で測定されるため、帯域幅を計算する際に桁違いに好まれます。ただし、ネットワーク帯域幅は通常、ビットの送信を制御するCPUのクロック速度によって制御され、このレートは次のようになります。ヘルツ(正確にはMHz)で測定されます。これは、の大きさのオーダーであり1000、ではありません 1024。ただし、ほとんどの場合、これら2つの数値は、重大なエラーを発生させない程度に近い値です。

于 2013-03-20T09:23:47.370 に答える
3

あなたがコメントしたあなたのリンクに基づいて、それを取得するか取得するためにそれを// Bandwidth : size(KB)/time(s)掛けるだけです、そしてダウンロード時間が0の場合、速度が1024bytes1024*8bitsamout/time

1.ビット単位で計算するには、

float bandwidth = contentLength / ((endTime-startTime) *(1000*1024*8));

2.ダウンロード時間が0の場合、何もダウンロードされていないため、バンドウィズを提案することはできません。

編集2

計算

それは単純な数学です

毎秒kbがある場合1 kb/ per 1 second

したがって、速度は1 kbps=>1*(1024 bytes)/ 1* (1000000000 nano seconds)

したがって、0.000001024ナノ秒あたりのバイト数

今ビットで1*(1024 * 8 bits)/ 1* (1000000000 nano seconds)

つまり、0.000008192ナノ秒あたりのビット数

さて、seoncdsでそれが必要な場合は、それを乗算するだけです。1000000000

っていうことは0.000008192 * 1000000000 = 8192 bits per second

および(0.000008192/8) * 1000000000 = 1024 bytes per secondまたは1 kbps

于 2013-03-20T09:03:31.490 に答える
3
public static String internetSpeed(long msecs, long bytes)
{
    long  secs  = msecs / 1000;                                     
    long  bits  = bytes * 8;
    float speed = bits / secs;

    long  Kbit  = 1024;
    long  Mbit  = Kbit * 1024;
    long  Gbit  = Mbit * 1024;

    if (speed < Kbit )                  return String.valueOf(speed)        + " bit-sec" ;
    if (speed > Kbit && speed < Mbit)   return String.valueOf(speed / Kbit) + " Kbit-sec";
    if (speed > Mbit && speed < Gbit)   return String.valueOf(speed / Mbit) + " Mbit-sec";
    if (speed > Gbit)                   return String.valueOf(speed / Gbit) + " Gbit-sec";
    return "???";
}

このメソッドは次のように呼び出すことができます

....
System.out.println(internetSpeed((endTime-startTime), contentLength));
....
于 2014-04-09T11:46:24.250 に答える
1

サーバーから既知のサイズのファイルをダウンロードできます。

long startTime = System.currentTimeMillis();
HttpGet httpRequest = new HttpGet(new URL(urlString).toURI());
HttpClient httpClient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpClient.execute(httpRequest);
long endTime = System.currentTimeMillis();

HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity;
bufHttpEntity = new BufferedHttpEntity(entity);

//You can re-check the size of your file
final long contentLength = bufHttpEntity.getContentLength();

// Log
Log.d(TAG, "[BENCHMARK] Dowload time :"+(endTime-startTime)+" ms");

// Bandwidth : size(KB)/time(s)
float bandwidth = contentLength / ((endTime-startTime) *1000);

このコードで直接wifiの速度を取得します

WifiManager wifiManager = Context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo != null) {
    Integer linkSpeed = wifiInfo.getLinkSpeed(); //measured using WifiInfo.LINK_SPEED_UNITS
}
于 2013-03-20T09:00:37.523 に答える