计算带宽的公式

时间:2013-03-20 08:55:47

标签: android bandwidth

真的与带宽计算公式混淆。
参考带宽检测问题Check the bandwidth rate in Android我正在尝试计算带宽如下。

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. 

我需要的是当前带宽(不是字节或千字节)。如果以字节或位计算带宽,我不知道使用上面的公式。

如果下载时间是0秒,那么带宽应该是下载的内容长度。 有人可以建议正确的公式来计算带宽。

4 个答案:

答案 0 :(得分:5)

首先,为了精确起见,您应该使用1000.0转换为秒,因为您要将带宽分配给float变量:

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

现在,由于您的contentLength以字节为单位,因此您需要转换为位(Kb,Mb等)。每个字节有8位,因此contentLength*8将字节转换为位。

Kilo-> Mega-> Giga - > ...比特单位的比例转换大约为1000,这意味着将比特转换为Megabits需要除以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 / s),则比例转换大约为1024

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

编辑#2:在谈到带宽时,“Mega”和“Kilo”等的定义可能有些含糊不清。通常1024(2 10 )和1000(10 3 )可以互换使用(很可能是一次事故)。对于许多情况,1024在计算带宽时可能是有利的,因为计算机上的存储器存储空间是在基数2中测量的。但是,网络带宽通常由调节位传输的CPU的时钟速度控制。 ,此速率以赫兹(精确到MHz)为单位测量,其大小为1000 1024。但是在大多数情况下,这两个数字足够接近,不会产生明显的错误。

答案 1 :(得分:3)

根据您发表评论的// Bandwidth : size(KB)/time(s) 1024bytes只需将其乘以1024*8即可获得bitsamout/time float bandwidth = contentLength / ((endTime-startTime) *(1000*1024*8)); ,如果下载时间为0,那么技术上没有下载任何内容,因为速度为1 kb/ per 1 second

1.用于计算比特只需使用

1 kbps

2.如果下载时间为0,则没有下载任何内容,因此我们无法建议带宽

编辑2

<强>计算

这就是简单的数学

如果你有像1*(1024 bytes)/ 1* (1000000000 nano seconds)

那样的每秒kb

所以速度为0.000001024 =&gt; 1*(1024 * 8 bits)/ 1* (1000000000 nano seconds)

所以每个纳米seonds 0.000008192个字节

现在位为1000000000

所以每纳秒的0.000008192 * 1000000000 = 8192 bits per second

现在,如果你想要它在seoncds,那么只需乘以(0.000008192/8) * 1000000000 = 1024 bytes per second

所以1 kbps

和{{1}}或{{1}}

答案 2 :(得分: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));
....

答案 3 :(得分: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
}