2012-05-08 65 views
4

在我的下載管理器應用程序,我使用下面的代碼來計算當前的傳輸速率:計算電流(不平均)的下載速度

 TimeSpan interval = DateTime.Now - lastUpdateTime; 

     downloadSpeed = (int)Math.Floor((double)(DownloadedSize + cachedSize - lastUpdateDownloadedSize)/interval.TotalSeconds); 

     lastUpdateDownloadedSize = DownloadedSize + cachedSize; 
     lastUpdateTime = DateTime.Now; 

這主要工作就是我想要的(我更新速度每4秒左右),但隨着波動,下載速度總是會有一些瘋狂的高峯。我的平均下載速度約爲600 kB/s,有時顯示10.25 MB/s甚至負值,如-2093848 B/s。這怎麼可能?

什麼是計算實時下載速率的最佳方法?我對平均費率(DownloadedSize/TimeElapsed.TotalSeconds)不感興趣,因爲它沒有給出真實的結果。

+0

您應該使用DateTime.UtcNow而不是DateTime.Now,它每年不會更改兩次。 – spender

+0

您的計算是否有效抵消了「DownloadedSize/interval.TotalSeconds」? – spender

+0

在微積分書或在線查找瞬時變化率。 –

回答

4

鑑於「實時」是無法實現的,您應該嘗試模擬它,通過使間隔儘可能小和精確,並計算間隔內的平均值,檢查代碼的完整性。例如:

與您的代碼
DateTime now = DateTime.Now; 
TimeSpan interval = now - lastUpdateTime; 
timeDiff = interval.TotalSeconds; 
sizeDiff = DownloadedSize + cachedSize - lastUpdateDownloadedSize; 
speed = (int)Math.Floor((double)(sizeDiff)/timeDiff); 
lastUpdateDownloadedSize = DownloadedSize + cachedSize; 
lastUpdateTime = now; 

一個區別:

  1. 只有現在計算一次,使用兩次。
+2

我不同意你在TotalSeconds上使用TotalMilliseconds的原因。兩者都由雙精度浮點數表示。相對於另一個,不會有任何精度損失......您只需添加更多計算。 – spender

+0

你是那麼完全正確....我會編輯相應的答案 – rewritten

+0

謝謝saverio,我認爲有一些問題的時間間隔,因爲這個速度計算是每隔幾毫秒。現在我每隔一秒左右就會計算一次,並且沒有大幅上漲。 – marko