2016-03-30 9 views

risposta

20

Circa read:

  • read supporta i livelli PerlIO.
  • read funziona con qualsiasi handle di file Perl [1].
  • read buffer.
  • read ottiene i dati dal sistema in blocchi di dimensioni fisse di 8 KiB [2].
  • read potrebbe bloccare se sono disponibili meno dati di quelli richiesti [3].

Circa sysread:

  • sysread non supporta i livelli PerlIO (il che significa che richiede un grezzo maniglia binario anche noto come).
  • sysread funziona solo con gli handle di file Perl mappati a un file di sistema handle/descriptor [4].
  • sysread non buffer.
  • sysread esegue una singola chiamata di sistema.
  • sysread restituisce immediatamente se i dati sono disponibili per essere restituiti, anche se la quantità di dati è inferiore all'importo richiesto.

Sintesi e conclusioni:

  • read opere con qualsiasi gestore di file Perl, mentre sysread è limitata a file di Perl maniglie associati a un file system maniglia/descrittore.
  • read non è compatibile con select[5], mentre sysread è compatibile con select.
  • read in grado di eseguire la decodifica per voi, mentre sysread richiede che si esegue la propria decodifica.
  • read dovrebbe essere più veloce per letture molto piccole, mentre sysread dovrebbe essere più veloce per letture più grandi.

Note:

  1. Questi comprendono, ad esempio, file handle legati e quelli creati utilizzando open(my $fh, '<', \$var).

  2. Prima di 5.14, Perl legge 4 blocchi KiB. Dalla versione 5.14, la dimensione dei blocchi è configurabile quando si crea perl, con un valore predefinito di 8 KiB.

  3. In base alla mia esperienza, read restituirà esattamente l'importo richiesto (se possibile) durante la lettura da un file normale, ma potrebbe restituire meno durante la lettura da una pipe. Questi risultati non sono affatto garantiti.

  4. fileno restituisce un numero non negativo per questi. Questi includono, ad esempio, handle che leggono da file semplici, da pipe e da socket, ma non quelli menzionati in [1].

  5. Mi riferisco a quello a 4 argomenti chiamato da IO::Select.

+1

Ottimo riassunto. - dovrebbe essere in perlfunc. Questo: "' read' dovrebbe essere più veloce per le letture di piccole dimensioni, mentre 'sysread' dovrebbe essere più veloce per le letture di grandi dimensioni." è esattamente ciò che è necessario. Naturalmente, date le infinite possibilità della parola reale, potrebbe non essere sempre ** vero, ma una linea guida perlinea perlopiù sincera è ciò che voglio. –

+1

In una risposta a [un'altra domanda] (http://stackoverflow.com/a/36208336/2019415) ho usato ['Stream :: Reader'] (https://metacpan.org/pod/Stream::eader) . Come esperimento ho sostituito 'read' con' sysread' in 'Reader.pm' e ho ottenuto un throughput del 9-10% - sembrava troppo facile. Oltre ai bit ovvi (buffering, encoding,) è solo una questione di benchmarking e testing? Puoi parlare a qualsiasi integrità dei dati, elementi di failover/robustezza di questo? –

+1

@ G.Cito in codice riusabile come Stream :: Reader, devi supporre che i filehandle abbiano dei layer, quindi sysread non è un'opzione. – ysth

Problemi correlati