【问题标题】:Formula for Calculating bandwidth带宽计算公式
【发布时间】:2014-04-09 20:25:11
【问题描述】:

真的和带宽计算公式混淆了。
参考带宽检测问题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 秒,那么带宽应该是下载内容的长度。 有人可以建议正确的公式来计算以比特为单位的带宽。

【问题讨论】:

    标签: android bandwidth


    【解决方案1】:

    首先,为了精确起见,您应该使用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/s)计价,则比例转换为 1024

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

    编辑#2:我意识到,在谈到带宽时,“Mega”和“Kilo”等的定义可能有点模棱两可。通常1024 (210) 和1000 (103) 可以互换使用(很可能是意外)。在许多情况下,1024 在计算带宽时可能会被视为数量级,因为计算机上的内存存储空间是以 2 为基数测量的。但是,网络带宽通常由调节位传输的 CPU 的时钟速度控制,并且此速率以赫兹(准确地说是 MHz)为单位测量,其数量级为 1000not 1024。但是在大多数情况下,这两个数字足够接近,不会产生重大错误。

    【讨论】:

    • 但我希望它以位而不是字节或千字节为单位。所以float bandwidth 是位吗?
    • bandwidth 的计量单位取决于您使用的转换。由于getContentLength() 返回一个字节数,因此您必须乘以 8 转换为位。
    • 我必须将计算的带宽与一些计算的位进行比较,以检查它是否在该颗粒范围内,所以我希望带宽以位为单位。是的getContentLength 正在返回字节数,但我可以将带宽计算转换为位吗?
    【解决方案2】:

    根据你给它的link,你给它的评论是// Bandwidth : size(KB)/time(s),所以只需将它乘以1024得到bytes1024*8得到它在bits,如果下载时间是0 那么技术上没有下载任何东西,因为速度是amout/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 second1 kbps

    【讨论】:

    • 如果下载时间为 0 秒,这意味着下载需要以毫秒为单位的时间,根据您的计算,如果 contentLength 为 51200 (50KB),则带宽为 0。
    • 您使用的代码为System.currentTimeMillis()。因此,(endTime-startTime) 的区别在于以毫秒为单位的答案,对吗??如果您的 gettimg 时间为 0,那么您是否检查了日志天气 startTimeendTime 正在记录或具有 0 值??
    • 是的,开始时间和结束时间被记录下来,我的 http 请求下载时间不到 0 秒。因此,使用您的公式,对于 51200 字节的内容长度,我将带宽值设为 0。
    • 您是否尝试过使用 nanoTime 而不是毫秒 long startTime = System.nanoTime(); long endTime= System.nanoTime() - startTime;
    • 我面临的实际问题是,我想要的带宽不是字节/MB/kbytes。我可以以纳/米尔/秒为单位获得系统时间,但我被困在以比特为单位计算带宽。
    【解决方案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));
    ....
    

    【讨论】:

      【解决方案4】:

      您可以从您的服务器下载一个已知大小的文件。

      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
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多