2012-07-31 3 views
1

순시 처리량을 어떻게 계산할 수 있습니까? 예를 들어, 파일을 다운로드 할 때 브라우저가 수행하는 것과 유사한 방식으로. 이는 단순히 평균 처리량이 아니라 순간적으로 추정하는 것입니다. 아마도 '이동 평균'을 사용했을 것입니다. 알고리즘을 찾고 있는데 C++로 지정할 수 있습니다. 이상적으로는 스레드를 포함하지 않고 (즉, 지속적으로 새로 고침, 매초마다), 값이 요청 될 때만 평가됩니다.처리량 네트워크 추정

+0

패킷 네트워크에는 "순간 처리량"이란 정의가 없습니다. 무한대를 제외하고 거의 항상 0입니다. 거의 확실하게 평균 처리량이 필요하지만 고정 된 기간 (예 : 지난 1 분의 평균)입니다. – MSalters

+0

좋습니다. 파이어 폭스 또는 다른 다운로드 프로그램이 어떻게 작동합니까? – NaomiJO

+0

그들이 게으른 경우. 더 똑똑한 프로그램은 최근 평균과 이전 평균을 모두 사용하지만 최근 평균에 더 많은 가중치를주는보다 복잡한 이동 평균 기능을 사용합니다. – MSalters

답변

2

here 설명과 같이, 지수 이동 평균을 사용할 수 있지만 수식 반복합니다 :

accumulator = (alpha * new_value) + (1.0 - alpha) * accumulator 

는 추정을 달성하면 매 초마다 계산을 조회하려는 생각하기를,하지만 당신이 원하는 마지막 순간의 평균.

struct AvgBps { 
    double rate_;   // The average rate 
    double last_;   // Accumulates bytes added until average is computed 
    time_t prev_;   // Time of previous update 
    AvgBps() : rate_(0), last_(0), prev_(time(0)) {} 
    void add (unsigned bytes) { 
     time_t now = time(0); 
     if (now - prev_ < 60) {  // The update is within the last minute 
      last_ += bytes;   // Accumulate bytes into last 
      if (now > prev_) {  // More than a second elapsed from previous 
       // exponential moving average 
       // the more time that has elapsed between updates, the more 
       // weight is assigned for the accumulated bytes 
       double alpha = (now - prev_)/60.0; 
       rate = alpha * last_ + (1 - alpha) * rate; 
       last_ = 0;   // Reset last_ (it has been averaged in) 
       prev_ = now;   // Update prev_ to current time 
      } 
     } else {      // The update is longer than a minute ago 
      rate_ = bytes;   // Current update is average rate 
      last_ = 0;    // Reset last_ 
      prev_ = now;    // Update prev_ 
     } 
    } 
    double rate() { 
     add(0);      // Compute rate by doing an update of 0 bytes 
     return rate_;     // Return computed rate 
    } 
}; 

당신은 실제로 대신 time의 단조 클럭을 사용한다 : 다음, 여기에 견적을 얻을 수있는 하나 개의 방법이 될 것입니다.

+0

그게 아마도 내가 뭘 찾고있어, 고마워. 나는 초당 얼마나 많은 시간을 처리해야하는지에 대해 잘 알고 있지 않다. 이전에 액세스 한 것처럼 값을 계산할 수 있지만 미리 정의 된 액세스 시간이 없다는 것을 알고 있습니까? 또한 코드에 대해 더 설명하거나 설명해 주시겠습니까? 저는 C++을 잘 못합니다. 잘 작성되었지만 초보자를 읽기가 어렵습니다. – NaomiJO

+0

@NaomiJO : 코드는 쿼리 빈도 나 업데이트 빈도에 영향을주지 않습니다. 그러나 업데이트가 이전 업데이트에서 60 초보다 긴 경우 현재 업데이트를 마지막 순간의 비율로 사용합니다. – jxh

+0

인라인 주석을 주셔서 대단히 감사합니다. 매우 신중하게 읽어 드리겠습니다. 질문이 더 있으시면 다시 연락 드리겠습니다. – NaomiJO

0

아마도 박스형 평균을 원할 것입니다.

그냥 마지막 n 개의 값을 유지하고 평균을 구하십시오. 후속 블록마다 가장 오래된 것을 빼고 가장 최근의 것을 더합니다. 부동 소수점 값의 경우 집계 된 오류가 발생할 수 있으므로이 경우 m 값마다 처음부터 합계를 다시 계산할 수 있습니다. 물론 정수 값의 경우에는 그런 것이 필요하지 않습니다.

+0

그건 재미있는 생각이에요. 부동 소수점 값에 대해서는 언급하지 않았습니다. 발생할 수있는 문제에 대해 더 자세히 설명해 주시겠습니까? 그리고 '후속 블록'이란 무엇을 의미합니까 (패킷이 전송되지 않을 때 리프레시되는 방식은 x 밀리 초마다 새로 고침됩니까?) (1) 패킷이 전송되거나 2) 값을 액세스해야하며, 마지막으로 액세스 한 시간의 기록을 유지하는 내부 변수 형식을 취할 수 있습니다. – NaomiJO

+0

부동 소수점 산술은 약간의 정밀도 오류가 발생할 수 있습니다. 정수만을 다루는 경우 정수 연산은 정확합니다. http://docs.python.org/tutorial/floatingpoint.html 부동 소수점을 사용하는 경우 아마 n 블록마다 처음부터 다시 계산할 수 있습니다. – user1277476