真的与带宽计算公式混淆。
参考带宽检测问题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秒,那么带宽应该是下载的内容长度。 有人可以建议正确的公式来计算带宽。
答案 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)
1024
,bytes
只需将其乘以1024*8
即可获得bits
或amout/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)
所以速度为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
}