2016-03-30 44 views

Odpowiedz

20

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, natomiast sysread jest ograniczony do pliku Perl obsługuje mapowane do pliku system uchwytów/deskryptora.
  • read nie jest kompatybilny z select[5], a sysread jest zgodny z select.
  • read może wykonać dekodowanie, podczas gdy sysread wymaga samodzielnego dekodowania.
  • read powinna być szybsza dla bardzo małych odczytów, natomiast sysread powinna być szybsza dla większych odczytów.

Uwagi:

  1. Należą do nich na przykład, związany uchwyty plików i te stworzone przy użyciu open(my $fh, '<', \$var).

  2. 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.

  3. 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.

  4. 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].

  5. Mam na myśli 4-argumenty o nazwie IO::Select.

+1

Ś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. –

+1

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? –

+1

@ 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