2008-12-16 85 views
10

我有一個客戶端和服務器程序(都在Obj-C),我正在使用這兩個程序在兩個設備之間傳輸文件。計算連接/下載速度

傳輸工作正常,但我想向用戶展示他們獲得的傳輸速率。

因此,我知道文件的總大小以及文件傳輸量有多少,有沒有辦法從這些信息中找出傳輸速率,如果沒有,我需要什麼信息來計算傳輸速度?

感謝

+1

對於那些遇到這個問題,這一個也可能會有所幫助:http://stackoverflow.com/q/2779600/115730 – 2010-10-20 06:05:50

回答

20

一旦你開始下載,捕捉當前系統時間,並將其存儲爲「開始時間」。然後,所有你需要做的在傳輸過程中的任何點來計算傳輸速度是在系統時間再看看,並把它作爲「當前時間」來計算,到目前爲止花費的總時間:

transfer_speed = bytes_transferred/(current_time - start_time) 

您可能想要在時間上使用秒或毫秒的精度,當然如果您想要位/秒,可以將結果乘以8。

由於您使用的是Cocoa,因此您可以使用NSDate類獲取時間戳。例如,使用以下時開始傳送:

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 

然後定期通過檢查傳輸速率:

double speed = bytesTransferred/([NSDate timeIntervalSinceReferenceDate] - start); 
+4

Poitner *不應與NSTimerInterval一起使用。請更正 – ashish 2014-01-06 08:38:55

+0

Hi Marc。我可以知道我們如何將速度轉換爲Kbps或mbps。 – Naresh 2014-08-08 06:34:35

0

持續跟蹤轉移走的是時間。傳輸速率只是字節傳輸/秒數,換句話說是每秒字節數。你不需要這個總大小。 (您還可以顯示完成的百分比,這是傳輸的字節/總字節* 100)

1

你需要知道

  1. 字節從一開始就派(爲了計算轉移的平均速率)

  2. 自去年第二發送
  3. 字節(爲了計算當前的傳輸速度。)

    這可以很容易做到,如果你知道從一開始發送的字節數。 (從一開始就發送新的字節 - 字節從一開始就發送1秒前)

  4. 文件總大小(要計算的進度百分比。)

    (字節字節轉移/總數)

40

用簡單的方式是bytes_downloaded/(now - start_time),但如果連接速度波動很大,或者如果用戶開始另一個下載(也許在另一個應用程序),中途你的下載變得不準確。如果用戶在後臺運行洪流,這兩種情況都可能發生。

一個更好的方法(儘管難以實現)是保持一個週期性樣本陣列並呈現平均值。

從包含0的數組開始。數組是樣本,每個樣本是自上一個樣本以來下載的字節數。然後開始下載。

每隔半秒鐘(您可以嘗試不同的時間間隔),測量您下載了多少字節,然後從這個新總數中減去前一個總數。將差異添加爲數組中新的最後一個元素。如果這增加了數組超過一定的大小,砍掉第一個元素(最舊的樣本)。然後,顯示所有樣本的平均值。

你應該保持2-5秒的樣本價值,間隔應該在0.5到1秒之間(這是貨幣和表現之間的折中)。

如果檢索結果爲零,您可能還想從數組中移除第一個元素。這使得您的起始報告更加準確,並幫助您從攤位中更快地恢復,因爲您的平均值不包含舊的零。