2012-07-31 156 views
1

我怎樣才能估計即時吞吐量?例如,以類似於瀏覽器下載文件的方式。這不僅僅是一個平均吞吐量,而是一個瞬時估計,也許是一個'移動平均值'。我正在尋找算法,但您可以在C++中指定它。理想情況下,它不會涉及一個線程(即每秒鐘不斷刷新),而是隻在值被要求時才被評估。吞吐量網絡估計

+0

分組網絡中的「瞬時吞吐量」沒有明確的定義。除非是無窮大時,它幾乎總是零。你幾乎可以肯定需要一個平均吞吐量,但是在一個固定的時間週期內(例如最後一分鐘的平均值)。 – MSalters 2012-07-31 08:17:43

+0

好的。這是如何Firefox或其他下載程序的工作? – NaomiJO 2012-08-03 13:48:00

+0

如果他們懶惰。更智能的程序使用更復雜的移動平均線功能,該功能既使用近期平均值,也使用老年平均值,但對最近的平均值給予更多權重。 – MSalters 2012-08-03 14:29:52

回答

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 2012-08-03 13:53:18

+0

@NaomiJO:代碼並不在乎你多久查詢一次或多久更新一次。但是,如果更新的時間超過了上次更新的60秒以上,則只會將當前更新作爲最後一分鐘的速率。 – jxh 2012-08-03 13:59:45

+0

非常感謝您提供的內嵌註釋,請讓我仔細閱讀,如果我還有其他問題,我會盡快與您聯繫。 – NaomiJO 2012-08-03 14:58:18

0

你可能想要一個boxcar的平均值。

只保留最後n個值,並對它們進行平均。對於每個後續塊,減去最老的並添加最近的塊。請注意,對於浮點值,您可能會收到一些彙總錯誤,在這種情況下,您可能需要重新計算每個m值從頭開始的總數。對於整數值當然,你不需要那樣的東西。

+0

這是一個有趣的想法。我沒有看到有關浮點值的評論。你能否更詳細地解釋可能發生的問題。而'後續的塊'是什麼意思(當沒有數據包被髮送時它是如何刷新的?它是否每x毫秒刷新一次?理想情況下,我寧願只有刷新時纔會刷新數據包(1)發送數據包或2)需要訪問該值,這可以採用內部變量的形式,保存上次訪問的記錄) – NaomiJO 2012-08-03 13:45:59

+0

浮點運算的精度會有輕微的誤差。整數算術是確切的,假設你只處理整數。 http://docs.python.org/tutorial/floatingpoint.html如果使用浮點,我可能會重新計算每n個塊。 – user1277476 2012-08-03 16:36:09