2008-12-16 18 views
10

J'ai un programme client et serveur (tous les deux dans Obj-C) et je transfère des fichiers entre deux appareils en utilisant les programmes. Le transfert fonctionne bien, mais je voudrais afficher à l'utilisateur quel taux de transfert ils obtiennent. Donc, je connais la taille totale du fichier et la quantité de fichier transférée, est-ce qu'il y a un moyen de calculer le taux de transfert à partir de cette information, et sinon, de quelle information ai-je besoin pour calculer le taux de transfert?Calcul de la vitesse de connexion/téléchargement

Merci

+1

Pour ceux qui rencontrent cette question, celle-ci peut également être utile: http://stackoverflow.com/q/2779600/115730 –

Répondre

20

Dès que vous commencez le téléchargement, la capture du temps du système actuel et de le stocker comme « heure de départ ». Ensuite, tout ce que vous devez faire pour calculer la vitesse de transfert à tout moment pendant le transfert est de regarder l'heure du système à nouveau et l'utiliser comme la « heure » pour calculer le temps total passé jusqu'à présent:

transfer_speed = bytes_transferred/(current_time - start_time) 

Vous voulez probablement utiliser une précision de seconde ou de milliseconde avec les temps, et bien sûr vous pouvez multiplier le résultat par 8 si vous voulez des bits/seconde.

Étant donné que vous utilisez Cocoa, vous pouvez utiliser la classe NSDate pour obtenir les horodatages. Par exemple, utilisez ce qui suit lorsque vous démarrez le transfert:

NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; 

vérifier ensuite périodiquement le taux de transfert en utilisant:

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

Poitner * ne doit pas être utilisé avec NSTimerInterval. S'il vous plaît corriger – ashish

+0

Salut Marc. Puis-je savoir comment pouvons-nous convertir cette vitesse en Kbps ou Mbps. – Naresh

+0

Hey - comment puis-je obtenir cette valeur en Mbps? –

0

Gardez une trace du temps que le transfert prend. Le taux de transfert est simplement le nombre d'octets transférés/secondes écoulées, c'est-à-dire d'octets par seconde. Vous n'avez pas besoin de la taille totale pour cela. (Vous pouvez également afficher% terminé, ce qui est octets transférés/octets au total * 100)

1

Vous devez connaître

  1. Octets envoyés depuis le début (Pour calculer le taux moyen de transfert)

  2. octets envoyés depuis la dernière seconde (pour calculer la vitesse de transfert en cours.)

    Ceci peut être facilement fait si vous connaissez octets envoyés depuis le début. (Nouveaux octets envoyés depuis le début - octets envoyés depuis le début ya 1 seconde)

  3. Taille totale du fichier (Pour calculer le pourcentage d'avancement.)

    (Octets TRANSFÉRÉ/Nombre total d'octets)

40

la façon naïve est bytes_downloaded/(now - start_time), mais qui devient inexact si la vitesse de connexion varie d'une manière extravagante, ou si l'utilisateur démarre un autre téléchargement (peut-être dans une autre application) à mi-chemin de téléchargement. Les deux peuvent se produire si l'utilisateur exécute un torrent en arrière-plan.

Une meilleure façon (bien que plus difficile à mettre en œuvre) est de conserver une série d'échantillons périodiques et de présenter la moyenne.Commencez par un tableau contenant 0. Le tableau contient des échantillons et chaque échantillon est le nombre d'octets téléchargés depuis l'exemple précédent. Ensuite, lancez le téléchargement.

Chaque demi-seconde (vous pouvez essayer différents intervalles), mesurez le nombre d'octets que vous avez téléchargés, puis soustrayez le total précédent de ce nouveau total. Ajoutez la différence en tant que nouveau dernier élément du tableau. Si cela fait croître le tableau au-delà d'une certaine taille, éliminez le premier élément (échantillon le plus ancien). Ensuite, présentez la moyenne de tous les échantillons. Vous devriez conserver entre 2 et 5 secondes d'échantillons, et l'intervalle devrait se situer entre 0,5 et 1 seconde (c'est un compromis entre la monnaie et la performance).

Vous pouvez également supprimer le premier élément du tableau après l'avoir récupéré s'il est égal à zéro. Cela rend votre reportage plus précis et vous aide à récupérer plus rapidement des étals, puisque vous n'incluez pas les anciens zéros dans la moyenne.

+1

Bonne réponse, je me suis toujours demandé quelle serait la meilleure façon de le faire. –

+0

Hey - comment puis-je obtenir cette valeur en Mbps? –

+0

Que diriez-vous d'utiliser la formule suggérée dans les RFC? 'SRTT <- (1 - alpha) * SRTT + alpha * R'' où' SRTT' est lissé RTT, 'R \' 'est le dernier RTT, et' alpha' recommandé est '1/8'. Si vous vous inquiétez de la déviation, il y a aussi une formule pour cela. (Bien que je ne sois pas sûr si ça vaut le coup ..) – BridgeTheGap