2012-06-02 2 views
2

ftp 다운로드 중에 실제 전송 속도를 측정하려고합니다. 다운로드 자체가 작동하고 스트림이 실행 루프에 연결됩니다. 측정은 이벤트 시작시 CFTimeGetCurrent를 사용하여 NSStreamEventHasBytesAvailable에서 수행되고 데이터가 파일에 기록 된 후 경과 시간이 (double) previousTimestamp-CFAbsoluteTimeGetCurrent와 함께 계산되지만, 내가 얻은 시간은 절대적으로 무리합니다. 시뮬레이터와 장치에 대한 테스트를 통해 누구나 나를 계몽 할 수 있습니까?정확하게 NSInputStream 데이터 속도를 측정하는 방법

코드 :

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(); 
+0

"하지만 내가 할 시간이 절대적으로 부당"에 대한 또 다른 좋은 링크 - 만약 당신이 어떤 값을받을 수 있나요? 너는 무엇을 기대 했는가? 왜? –

+0

글쎄, 내 목표는 KB/s로 전송 속도를 계산하는 것입니다. 그래서 bytesRead를 경과 시간과 1024로 나누면 (KB를 얻으려면) 결과가 300000KB/s와 같이 너무 커서 인터넷 연결에는 불가능합니다. – MartyRed

+0

그래서 "경과 시간"에는 어떤 단위가 있습니까? 초입니까? 밀리 초? –

답변

1

내가 시간을 캡처하는 time.h와 C 루틴을 사용하는 것입니다 사용한 대안.

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

SO iPhone: How to get current milliseconds?

+0

나는 succes가없는 첫 번째 링크를 시도했지만 c_time은 CPU 의존적 인 것으로 보입니다. 두 번째 aproach는 훨씬 더 현실적인 값을 제공하지만 여전히 작업 사이의 시간은 짧은 것으로 계산됩니다> 높은 대역폭으로 계산 된 대역폭 ... – MartyRed

+0

위의 접근 방식에서 Im이 올바르다면 이전 시간에서 새 시간을 뺍니다. 일반적으로 새 타임 스탬프는 이전 버전보다 큰 값이어야하므로 차이가 음수가됩니다. "downloadSpeedSave"루틴이 음수를 처리하는 방법을 알고 있습니까? "CFAbsoluteTimeGetCurrent() - previousTimestamp"를 시도해 보셨습니까? 또한 올바른 방법은 "CFAbsoluteTimeGetCurrent()"에서 반환 된 값을 변수에 저장 한 다음 "downloadSpeedSave"를 호출하고 "previousTimestamp"를 설정하는 것입니다. – trumpetlicks

+0

CFAbsoluteTimeGetCurrent()를 2 번 호출한다는 사실은 속도 계산에 사용하는 하나의 반환 값과 previousTimeStamp에 설정하는 다른 반환 값을 가져야 함을 의미합니다. 당신은 정말로 당신이 참조하는 1 점을 고르고 싶습니다. – trumpetlicks

관련 문제