2

真的与带宽计算公式混淆了。
参考带宽检测问题检查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

4 回答 4

5

首先,为了精确起见,您应该使用1000.0to 转换为秒,因为您将带宽分配给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/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。然而,在大多数情况下,这两个数字足够接近,不会产生重大错误。

于 2013-03-20T09:23:47.370 回答
3

根据您给出的链接,您对其评论说,// Bandwidth : size(KB)/time(s)只需将其乘以1024获取bytes1024*8获取它bits,如果下载时间为 0,则从技术上讲,没有下载任何内容,因为速度是amout/time

1.对于以位计算,只需使用

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

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

编辑 2

计算

那只是简单的数学

如果你每秒有 kb1 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 second1 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 回答