Witam!
Czy da się przerobić TEN skrypt tak aby zamiast wyświetlania ile bajtów przesłano, pokazywał prędkość wysyłania ?
Pozdrawiam.
Witam!
Czy da się przerobić TEN skrypt tak aby zamiast wyświetlania ile bajtów przesłano, pokazywał prędkość wysyłania ?
Pozdrawiam.
Nie powinno być problemów. Ogólnie chodzi o ten kawałek kodu:
while ($cursize < $size) {
$bufferlen = sysread($fh, $buffer, $maxbufsize, 0) || 0;
unless ($bufferlen) { die "Error while sending data: $!\n" }
print "$cursize of $size bytes sent.\n";
$cursize += $bufferlen;
print $socket $buffer;
}
Wystarczy, że obliczysz czas wysyłanie, np. za pomocą Time::HiRes::time (pobierasz czas przed wysłaniem, po wysłaniu i różnica to będzie mniej więcej czas wysyłania). Ilość wysłanych danych dzielisz przez ten czas i powinno działać.
Hmm, a mógłbyś mi to napisać ?
Głupio mi tak pisać, ale na prawdę, ten skrypt nie jest mój, a o perlu to nawet nie czytałem…
Pozdrawiam.
Spróbuj zmodyfikować kod w taki sposób:
...
use IO::Socket;
use Time::HiRes qw();
my($time0, $time1, $timediff, $curspeed);
my(...)
...
$bufferlen = sysread($fh, $buffer, $maxbufsize, 0) || 0;
unless ($bufferlen) { die "Error while sending data: $!\n" }
print "$cursize of $size bytes sent.\n";
$cursize += $bufferlen;
$time0 = Time::HiRes::time;
print $socket $buffer;
$time1 = Time::HiRes::time;
$timediff = $time1 - $time0;
$curspeed = $timediff != 0 ? $bufferlen / $timediff : 0;
printf "%.2f KiB/s\n", $curspeed / 1024;
Kod do wstawienia jest bez wcięcia, z wcięciem stary kod. Na początek deklarujesz zmienne oraz importujesz moduł Time::HiRes. Potem modyfikujesz wspomnianą pętlę while, jak pokazano.
Dzięki, ale jest błąd:
U mnie 107 to jest to:
$curspeed = $timediff != 0 ? $bufferlen / $timedeff : 0;
Pozdrawiam.
Wybacz, literówka. Oczywiście ma być timediff, nie mam pojęcia czemu napisałem timedeff.
$curspeed = $timediff != 0 ? $bufferlen / $timediff : 0;
No ale tego się można było domyślić, skoro wprowadziłem 4 zmienne ($time0, $time1, $timediff, $curspeed)
Jakiś błąd chyba jest bo pisze że:
A to wychodzi chyba 8.388608 gb, co jest nie możliwe bo plik 40mb wysyłało chwile.
Pozdrawiam.
Oczywiście zrobiłem najgłupszy z możliwych błędów, tj. odejmowałem czas wcześniejszy od późniejszego. Kod powyżej poprawiony, powiedz czy teraz daje sensowne wyniki.
// edit przetestowałem plik na kopiowaniu pliku na dysku (nie przez sieć) i daje zawyżone wyniki, szczerze nie wiem czy to tylko kwestia niedokładności obliczeń czy też coś innego.
Działa.
Zawyżone ? Hmm no nie wiem jak to sprawdzić.
Ale mam jeszcze pytanie czy ten skrypt nie ogranicza gdzieś prędkości ?
Bo na shellu nie przekracza 1010KiB/s, a jak uploaduje z tego samego shella przez ftp, to idzie spokojnie 6mB/s