2009-11-09 145 views
4

我已經實現了一個文件傳輸速率計算器,以顯示在我的應用程序中發生的上傳過程的kB /秒,但使用以下代碼,似乎我在我的KB/s讀數中獲得「突發」文件開始上傳後。計算上傳傳輸速度問題

這是我的流的代碼的部分中,此流在1024塊到服務器中使用的HttpWebRequest一個文件:

using (Stream httpWebRequestStream = httpWebRequest.GetRequestStream()) 
{ 
    if (request.DataStream != null) 
    { 
     byte[] buffer = new byte[1024]; 
     int bytesRead = 0; 

     Debug.WriteLine("File Start"); 
     var duration = new Stopwatch(); 
     duration.Start(); 
     while (true) 
     { 
      bytesRead = request.DataStream.Read(buffer, 0, buffer.Length); 
      if (bytesRead == 0) 
       break; 

      httpWebRequestStream.Write(buffer, 0, bytesRead); 
      totalBytes += bytesRead; 


      double bytesPerSecond = 0; 
      if (duration.Elapsed.TotalSeconds > 0) 
       bytesPerSecond = (totalBytes/duration.Elapsed.TotalSeconds); 

      Debug.WriteLine(((long)bytesPerSecond).FormatAsFileSize()); 
     } 
     duration.Stop(); 
     Debug.WriteLine("File End"); 
     request.DataStream.Close(); 
    } 
} 

現在上傳過程的輸出日誌和相關聯的Kb /秒讀數如下: (你會注意到一個新的文件開始,用「文件開始」和「文件結束」結束)

File Start 
5.19 MB 
7.89 MB 
9.35 MB 
11.12 MB 
12.2 MB 
13.13 MB 
13.84 MB 
14.42 MB 
41.97 kB 
37.44 kB 
41.17 kB 
37.68 kB 
40.81 kB 
40.21 kB 
33.8 kB 
34.68 kB 
33.34 kB 
35.3 kB 
33.92 kB 
35.7 kB 
34.36 kB 
35.99 kB 
34.7 kB 
34.85 kB 
File End 

File Start 
11.32 MB 
14.7 MB 
15.98 MB 
17.82 MB 
18.02 MB 
18.88 MB 
18.93 MB 
19.44 MB 
40.76 kB 
36.53 kB 
40.17 kB 
36.99 kB 
40.07 kB 
37.27 kB 
39.92 kB 
37.44 kB 
39.77 kB 
36.49 kB 
34.81 kB 
36.63 kB 
35.15 kB 
36.82 kB 
35.51 kB 
37.04 kB 
35.71 kB 
37.13 kB 
34.66 kB 
33.6 kB 
34.8 kB 
33.96 kB 
35.09 kB 
34.1 kB 
35.17 kB 
34.34 kB 
35.35 kB 
34.28 kB 
File End 

我的問題是,你會發現,在「爆」我一開始講的開始的每個新文件,在峯值達到峯值,然後平衡正常。這樣的上傳是否正常?我的上傳速度通常不會高於40k /秒,所以它不可能是正確的。

這是一個真正的問題,當我平均進行屏幕顯示的最後5到10秒時,它真的會拋出一些結果產生大約〜3MB/sec的結果!

任何想法,如果我接近這個問題的最佳途徑?我該怎麼辦? :S

格雷厄姆

另外:爲什麼我不能做 'bytesPerSecond = (bytesRead/duration.Elapsed.TotalSeconds)' 和移動duration.Start & duration.Stop到while循環和接收準確的結果?我會認爲這會更準確?每個速度讀數爲900字節/秒,800字節/秒等。

回答

3

我這樣做的方式是: 保存長傳輸的所有字節。

然後每隔1秒我檢查一下已轉移了多少。所以我基本上只觸發代碼,以節省一秒鐘的速度。您的while循環將在快速網絡中一秒鐘循環maaaaaaaaaaaany次。

根據網絡的速度,您可能需要檢查在單獨的線程或函數中傳輸的字節。我喜歡用定時器做這件事,所以我可以很容易地更新UI

編輯: 從你看你的代碼,即時猜測你做錯了什麼,你不考慮while(true)中的一個循環是不是1秒

編輯2: 另一個只做速度檢查的優點是事情會變得更快。在這種情況下,更新UI可能是你做的最慢的事情,所以如果你試圖在每個循環中更新UI,那很可能是你的最慢點,並且會產生沒有反應的UI。

你也正確,你應該avarage的價值觀,所以你沒有得到microsoft minutes錯誤。我normaly做的定時器功能運行做這樣的事情:

//Global variables 
long gTotalDownloadedBytes; 
long gCurrentDownloaded; // Where you add up from the download/upload untill the speedcheck is done. 
int gTotalDownloadSpeedChecks; 


//Inside function that does speedcheck  
gTotalDownloadedBytes += gCurrentDownloaded; 
gTotalDownloadSpeedChecks++; 

long AvgDwnSpeed = gTotalDownloadedBytes/gTotalDownloadSpeedChecks; // Assumes 1 speedcheck pr second. 
+0

感謝,以及循環不走高速每1024塊,但這也是順利更新進度條,這一切工作,並一直沒有問題。我認爲我已經通過調整我的平均值來等待一秒鐘來解釋我的問題,但是仍然不確定爲什麼會這樣爆發。 – GONeale 2009-11-09 12:28:19

+0

增加了EDIT2。解釋更多 – EKS 2009-11-09 12:32:16

+0

感謝EKS,你最大的幫助了我,我會看看我是否可以在以後進行優化。 – GONeale 2009-12-21 23:34:19

0

好,我想我已經通過調整5個固定我的問題 - 10 averging變量等待一秒鐘,佔爆裂,不最好的,但將允許互聯網自我排序,並允許我捕捉順利轉移。

它從我的網絡流量下來的權利是爆破出現這樣是沒有在代碼中,我可以做不同,以阻止這一切。

在我猶豫地接受我自己的答案之前,請您仍然對更多答案感興趣。

2

有你和你發送到系統軟件和硬件之間多層次,和一些這些層具有緩衝空間一定量可用。

當你第一次開始發送,您可以相當迅速泵出的數據,直到你填補這些緩衝器 - 這不是真正讓所有的方式向另一端那麼快,但!在填充發送緩衝區後,您只能將相同速率的更多數據放入發送緩衝區,因此您看到的速率將降至基礎網絡發送速率。您的評論