【问题标题】:How to correctly measure NSInputStream data rate如何正确测量 NSInputStream 数据速率
【发布时间】:2012-06-02 00:29:34
【问题描述】:

我正在尝试测量 ftp 下载期间的实际传输速度,下载本身正在运行,流连接在运行循环中。在事件开始时使用 CFTimeGetCurrent 在 NSStreamEventHasBytesAvailable 中完成测量,最后,在将数据写入文件后,使用 (double)previousTimestamp-CFAbsoluteTimeGetCurrent 计算经过的时间,但我得到的时间绝对不合理。在模拟器和设备上测试过,谁能赐教?

代码:

    switch (eventCode) {
    case NSStreamEventOpenCompleted: {            
    } break;
    case NSStreamEventHasBytesAvailable: {

        if ([[self.fileStream propertyForKey:NSStreamFileCurrentOffsetKey] intValue]==0) {

            previousTimestamp = CFAbsoluteTimeGetCurrent();

        }

        NSInteger       bytesRead;
        uint8_t         buffer[32768];

        bytesRead = [self.networkStream read:buffer maxLength:sizeof(buffer)];


        if (bytesRead == -1) 
        {
            [self _stopReceiveWithStatus:@"Err"];
        } 
        else if (bytesRead == 0) 
        {

            [self _stopReceiveWithStatus:nil];
        } 
        else 
        {
            [self completition:bytesRead];

            NSInteger   bytesWritten;
            NSInteger   bytesWrittenSoFar;

            // Write to the file.

            bytesWrittenSoFar = 0;
            do {
                bytesWritten = [self.fileStream write:&buffer[bytesWrittenSoFar] maxLength:bytesRead - bytesWrittenSoFar];
                assert(bytesWritten != 0);
                if (bytesWritten == -1) {
                    [self _stopReceiveWithStatus:@"File err"];
                    break;
                } else {
                    bytesWrittenSoFar += bytesWritten;
                }
            } while (bytesWrittenSoFar != bytesRead);

            [self downloadSpeedSave:bytesRead :previousTimestamp-CFAbsoluteTimeGetCurrent()];


            previousTimestamp = CFAbsoluteTimeGetCurrent();

【问题讨论】:

  • “但我得到的时间绝对不合理”——你得到了什么值?你期待什么?为什么?
  • 好吧,我的目标是以 KB/s 为单位计算传输速率,所以当我将 bytesRead 除以经过的时间并除以 1024(以获取 KB)时,结果太大了,例如 300000KB/s,而事实并非如此可能在我的互联网连接上...
  • 那么“经过时间”有什么单位呢?秒?毫秒?

标签: objective-c ios ios5 nsrunloop nsinputstream


【解决方案1】:

我使用的另一种方法是使用 time.h 和 c 例程来捕获时间。

http://www.cplusplus.com/reference/clibrary/ctime/time/

另一个关于 SO 的好链接 iPhone: How to get current milliseconds?

【讨论】:

  • 我试过第一个链接没有成功,c_time 似乎是 cpu - 依赖。第二种方法给出了更现实的值,但操作之间的时间似乎仍然很短=>计算带宽很高......
  • 如果我是正确的,在您的上述方法中,您可以从以前的方法中减去新的时间。这通常会导致差异为负,因为新时间戳应始终大于旧时间戳。您知道您的“downloadSpeedSave”例程如何处理负数吗?你试过“CFAbsoluteTimeGetCurrent() - previousTimestamp”吗?此外,更正确的方法是将“CFAbsoluteTimeGetCurrent()”返回的值存储到变量中,然后将其用于调用“downloadSpeedSave”和设置“previousTimestamp”!
  • 您对 CFAbsoluteTimeGetCurrent() 进行了 2 次调用这一事实意味着您应该获得一个用于速度计算的返回值和另一个您设置为 previousTimeStamp 的返回值。您确实想选择您引用的 1 个时间点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多