read
i sysread
mają bardzo podobną dokumentację. Jakie są różnice między tymi dwoma?Jaka jest różnica między `read` a` sysread`?
Odpowiedz
O read
:
read
obsługuje warstwy perlio.read
współpracuje z dowolnym uchwytem pliku Perl [1].read
zderzaki.read
uzyskuje dane z systemu w blokach o stałej wielkości 8 KiB [2].read
może blokować, jeśli dostępnych jest mniej danych niż żądany [3].
O sysread
:
sysread
nie obsługuje warstw perlio (czyli wymaga surowej a.k.a. uchwyt binarnego).sysread
działa tylko z uchwytami plików Perl mapującymi do pliku/deskryptora pliku systemowego [4].sysread
nie buforuje.sysread
wykonuje pojedyncze wywołanie systemowe.sysread
zwraca natychmiast, jeśli dane są dostępne do zwrócenia, nawet jeśli ilość danych jest mniejsza niż żądana kwota.
Podsumowanie i wnioski:
read
współpracuje z dowolnym uchwytu pliku Perl, natomiastsysread
jest ograniczony do pliku Perl obsługuje mapowane do pliku system uchwytów/deskryptora.read
nie jest kompatybilny zselect
[5], asysread
jest zgodny zselect
.read
może wykonać dekodowanie, podczas gdysysread
wymaga samodzielnego dekodowania.read
powinna być szybsza dla bardzo małych odczytów, natomiastsysread
powinna być szybsza dla większych odczytów.
Uwagi:
Należą do nich na przykład, związany uchwyty plików i te stworzone przy użyciu
open(my $fh, '<', \$var)
.Przed 5.14, Perl czytał w blokach 4 KiB. Od wersji 5.14 rozmiar bloków można konfigurować, budując
perl
z domyślną wartością 8 KiB.Z mojego doświadczenia wynika, że
read
zwróci dokładnie żądaną kwotę (jeśli to możliwe) podczas odczytu ze zwykłego pliku, ale może zwrócić mniej podczas odczytu z potoku. Wyniki te nie są w żaden sposób gwarantowane.fileno
zwraca dla nich liczbę nieujemną. Należą do nich na przykład uchwyty odczytujące zwykłe pliki, z rur i gniazd, ale nie wymienione w [1].Mam na myśli 4-argumenty o nazwie IO::Select.
Świetne podsumowanie. - powinien być w perlfunc. To: "' read' powinno być szybsze dla małych odczytów, natomiast 'sysread' powinno być szybsze dla dużych odczytów." jest dokładnie to, co jest potrzebne. Oczywiście, biorąc pod uwagę nieskończone możliwości prawdziwego słowa, to może nie zawsze ** być prawdziwe, ale to, co chcę, to w większości prawda. –
W odpowiedzi na [inne pytanie] (http://stackoverflow.com/a/36208336/2019415) użyłem ['Stream :: Reader'] (https://metacpan.org/pod/Stream::Reader) . Jako eksperyment zastąpiłem 'read' z' sysread' w 'Reader.pm' i zyskałem 9-10% przepustowości - wydawało się to zbyt łatwe. Poza oczywistymi bitami (buforowanie, kodowanie) jest to tylko kwestia testów porównawczych i testowania? Czy możesz porozmawiać o integralności danych, elementach failover/solidność tego? –
@ G.Cito w kodzie wielokrotnego użytku, takim jak Stream :: Reader, trzeba założyć, że uchwyty plików mogą mieć warstwy, więc sysread nie jest opcją. – ysth
grrr :-) To jest dobre pytanie –
Podziękowania dla @G. Cito za podpowiedzenie tego pytania. – ikegami