Was ist der beste Weg, um zu berechnen, Verbleibende download-Zeit?
Angenommen, Sie möchten berechnen Sie die Verbleibende download-Zeit, und Sie haben alle die Informationen, die benötigt werden, das heißt: Dateigröße, dl 'ed, Größe, Größe, Links, verstrichene Zeit, momentane dl-speed, etc'.
Wie würden Sie die Berechnung der restlichen dl Zeit?
Natürlich, die einfache Möglichkeit wäre entweder: Größe Links - /momentane dl-Geschwindigkeit, oder: (verstrichene Zeit/dl ' ed size)*Größe Links.
Nur, dass Sie die erste sein würde, vorbehaltlich der Abweichungen, die in die momentane Geschwindigkeit, und letzteres würde nicht passen sich gut an zu ändern Geschwindigkeiten.
Werden müssen, einige schlauere Weg, dies zu tun, richtig? Werfen Sie einen Blick auf die Raubkopien von software und Musik, die man derzeit herunterladen mit uTorrent. Es ist leicht zu bemerken, dass es nicht mehr als die einfache Berechnung erwähnt. Eigentlich habe ich bemerkt, dass manchmal, wenn die dl Geschwindigkeit sinkt, die verbleibenden Zeit auch Tropfen für ein paar Momente, bis es passt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, wie Sie sagte, mit dem absolut aktuellen download-Geschwindigkeit ist keine gute Methode, weil es dazu neigt, zu fluktuieren. Jedoch so etwas wie einen Allgemeinen Durchschnitt ist das nicht eine tolle Idee, entweder, weil es große Schwankungen gibt es auch.
Beachten, wenn ich starten Sie den Download einer Datei an der gleichen Zeit wie 9 andere. Ich bin nur immer 10% meiner normalen Geschwindigkeit, aber auf halbem Weg durch die Datei, die anderen 9 fertig. Jetzt bin ich Download auf die 10-fache Geschwindigkeit fing ich an. Meine ursprünglichen 10% Geschwindigkeit sollte nicht ein Faktor sein, der "wie viel Zeit bleibt noch?" Berechnung nicht mehr.
Persönlich, ich würde wahrscheinlich nehmen Sie einen Durchschnitt über die letzten 30 Sekunden oder so, und diese verwenden. Das sollte die Berechnungen basierend auf der letzten Geschwindigkeit, ohne schwankende Wild. 30 Sekunden kann nicht die richtige Menge, die es dauern würde, einige Experimente, um herauszufinden, eine gute Menge.
Andere option wäre, um eine Art "Fluktuation Schwelle", wo Sie tun keine Neuberechnung, bis die Geschwindigkeit ändert sich um mehr als die Schwelle. Zum Beispiel (Zufallszahl wieder, würde erfordern, Experimentieren), Sie könnte die Schwelle bei 10%. Dann, wenn Sie den Download bei 100kb/s, müssen Sie nicht eine Neuberechnung der verbleibenden Zeit, bis die download-Geschwindigkeit änderungen entweder unter 90kb/s 110kb/s. Wenn eine dieser änderungen passiert, die Zeit wird neu berechnet und ein neuer Schwellenwert festgelegt ist.
Könnten Sie einen Algorithmus zur Berechnung der Mittelwerte, wo die alten Werte Verfall Linear. Wenn S_n ist die Geschwindigkeit zum Zeitpunkt n und A_{n-1} ist der Durchschnitt zum Zeitpunkt n-1, dann definieren Sie Ihre mittlere Geschwindigkeit wie folgt.
A_1 = S_1
A_2 = (S_1 + S_2)/2
A_n = S_n/(n-1) + A_{n-1}(1-1/(n-1))
In Englisch, bedeutet dies, dass die länger in der Vergangenheit eine Messung aufgetreten, ist das weniger wichtig, weil Ihre Bedeutung abgeklungen ist.
Vergleichen Sie dies mit dem normalen Algorithmus zur Berechnung der Mittelwerte:
A_n = S_n/n + A_{n-1}(1-1/n)
Könnte man auch geometrisch Zerfall, die würden das Gewicht der jüngsten Geschwindigkeiten sehr stark:
A_n = S_n/2 + A_{n-1}/2
Wenn die Geschwindigkeiten sind dann 4,3,5,6
A_4 saiaźpcd im Dienst = 4.5 (Durchschnitt)
A_4 saiaźpcd im Dienst = 4.75 (linear decay)
A_4 saiaźpcd im Dienst = 5.125 (geometrische decay)
Beispiel in PHP
Beachten Sie, dass
$n+1
(nicht$n
) ist die aktuelle Anzahl der Datenpunkte aufgrund der PHP-arrays null-indiziert. Entsprechend der obigen Beispiel-setn == $n+1
odern-1 == $n
Ausgabe
Offensichtlicher Weise wäre etwas dazwischen, müssen Sie ein 'gleitender Durchschnitt' der download-Geschwindigkeit.
Ich denke, es ist nur ein Algorithmus zur Berechnung der Mittelwerte. Es Durchschnitt die rate über ein paar Sekunden.
Was Sie tun können, ist, auch verfolgen Sie Ihre Durchschnittliche Geschwindigkeit und zeigt eine Berechnung, dass, wie gut.
EDIT: Hier ist, was ich schließlich vorschlagen, ich habe es ausprobiert und es sieht ganz befriedigende Ergebnisse:
Habe ich eine null initialisiert Arrays für jede download-Geschwindigkeit zwischen 0 - 500 kB/s (könnte höher sein, wenn Sie erwarten, dass solche Geschwindigkeiten) in 1 kB/s-Schritten.
Ich Probe die download-Geschwindigkeit momentan (jeder zweite ist ein gutes Intervall), und die Schrittweite in der jeweiligen array-Element von einem.
Jetzt weiß ich, wie viele Sekunden habe ich damit verbracht, die Datei herunterzuladen, bei jeder Drehzahl. Die Summe all dieser Werte ist die verstrichene Zeit (in Sekunden). Die Summe dieser Werte multipliziert mit der entsprechenden Geschwindigkeit ist die Größe heruntergeladen, so weit.
Wenn ich das Verhältnis zwischen jedem einzelnen Wert im array und die verstrichene Zeit, vorausgesetzt, die variation der Drehzahl Muster stabalizes, ich kann die form einer Formel zur Vorhersage der Zeit jede Größe nehmen. Diese Größe ist in diesem Fall, die Größe der übrigen. Das ist, was ich Tue:
Ich nehme die Summe der einzelnen array-Element mit dem Wert multipliziert mit der entsprechenden Geschwindigkeit (Speed-index) und dividiert durch die verstrichene Zeit. Dann Teile ich die Größe Links von diesem Wert, und das ist die Zeit Links.
Dauert ein paar Sekunden stabalize, und arbeitet dann sehr verdammt gut.
Beachten Sie, dass dies ein "kompliziertes" im Durchschnitt, so die Methode verwerfen, ältere Werte (gleitender Durchschnitt) verbessern könnte es sogar noch weiter.
Für Interessierte, schrieb ich ein open-source-Bibliothek, die in C# genannt Progression, dass ein "moving-average" Umsetzung: ETACalculator.cs.
Den Progression Bibliothek definiert eine einfach zu bedienende Struktur für die Berichterstattung verschiedene Arten von Fortschritt. Es auch einfach behandelt verschachtelte Fortschritt für sehr glatte Fortschrittsberichte.