2014-05-15 11 views

risposta

12

Compilare Perl con i supporti di thread aggiunge un sacco di spese generali a causa di tutto il blocco, anche se non si utilizzano thread nel programma. Ho misurato circa il 15% di overhead per un benchmark semplice usando solo Perl compilato con il supporto dei thread.

+0

Non sono sicuro di capire questo, o forse sarebbe meglio dire che spero di essere frainteso. Stai dicendo che se eseguo un modulo perl che non utilizza thread, otterrò livelli di prestazioni diversi a seconda del fatto che il perl con cui sono stato eseguito è stato compilato con l'argomento -DuseThreads? Sapevo che i thread perl erano ... non i migliori thread in circolazione, ma non mi sarei mai aspettato che l'interprete prenda quel tipo di hit se un programma non ha mai caricato thread. Si potrebbe pensare che accendere o spegnere il comportamento dell'interprete appropriato, quindi quando i thread non vengono utilizzati il ​​blocco non si verifica? – dsollen

+1

@dsollen: lo capisci correttamente. Se Perl è compilato con supporto per i thread, ha bisogno di rendere diverse strutture interne sicure contro l'uso parallelo, cioè il blocco ecc. Ciò significa sovraccarico. Questo non è specifico di Perl, vale a dire in passato in cui non erano utilizzate CPU multi-core che era molto comune usare un kernel single-core in varie versioni UNIX perché il kernel multi-core aveva appena introdotto più overhead e quindi meno prestazioni . –

+0

Oh non mi sorprende interpretare in modo thread-safe richiede più tempo. Sono rimasto sorpreso dal fatto che non abbiano un modo di passare tra le modalità thread safe e non-threadsafe in modo tale che se non si ha "use threads" da qualche parte nel codice si esegue senza sicurezza thread. Guardando indietro, però, mi rendo conto che in un linguaggio completamente interpretato non si riesce a capire piuttosto che i thread saranno usati prima del runtime per decidere quale interprete usare; il mio pregiudizio linguistico compilato sta mostrando. Comunque, penserei che almeno perl compilato per i thread abbia un argomento della riga cmd di -no-thread per usare un interprete più veloce – dsollen

1

Il threading Perl non sta eseguendo il thread nel senso comune, in realtà esegue un interprete separato per ogni thread, quindi non esiste uno stato condiviso. Un modello di memoria condivisa è la ragione principale per utilizzare thread e processi di forking, quindi i thread Perl vengono utilizzati raramente.

Inoltre, è facile finire con arresti anomali o altri comportamenti imprevisti se si utilizzano moduli che non sono thread-safe da più thread contemporaneamente.

Vedere http://perldoc.perl.org/threads.html per ulteriori informazioni.

+0

Sì, ma avere una versione Perl che supporta thread non ti obbliga a usarlo. Avere una tale versione e usarla con script che non usano thread non dovrebbe essere un problema. Oppure è disabilitato per costringere gli utenti a pensare prima di usare i thread (qualcosa del genere: vuoi usare thread, cattiva idea, pensare e reinstallare perl?) – Matteo

+0

Non si tratta di costringerti a usarlo o meno, si tratta di differenze interne che influenzano robustezza e prestazioni, in particolare quando non la si utilizza. – codenheim

4

Perché non è robusto e sufficientemente performante da essere l'impostazione predefinita.

Oltre a questo, è necessario considerare CPAN. Ci sono troppi moduli scritti in C senza problemi per i thread.

Dico questo con tutto il dovuto amore e rispetto come ex sviluppatore Perl6/Parrot. Perl5 non è stato progettato partendo da zero con il threading (almeno quando sono stato coinvolto nella comunità).

A questo punto, non credo che ci sia abbastanza bisogno di cambiarlo. Il futuro sarebbe stato Perl6, e Parrot aveva discussioni molto presto. Probabilmente, destabilizzare Perl 5 a questo punto del suo ciclo di vita è discutibile.

Non è che Perl sia univoco in questo, Linux è stato allo stesso modo per un lungo periodo di tempo (in quanto c'era un grande blocco del kernel che doveva essere risolto). La maggior parte dei progetti inizia così, ma alcuni la prendono più lontano di altri prima di affrontarla.

1

Da discussioni perl tutorial:

Basic Thread Support

supporto thread è un'opzione di compilazione Perl. È qualcosa che è attivato o disattivato quando Perl è stato creato sul tuo sito, piuttosto che quando i tuoi programmi sono compilati con lo . Se il tuo Perl non è stato compilato con il supporto thread abilitato, qualsiasi tentativo di utilizzare thread avrà esito negativo.

I programmi possono utilizzare il modulo Config per verificare se i filetti sono abilitati .

2

Come ha detto steffen-ultisch, si tratta di un problema di prestazioni.

Ma, se lo si desidera, è possibile installare facilmente Perl sia con che senza thread, in modo da poter utilizzare la versione più appropriata per un determinato script.

L'incantesimo perlbrew, diciamo per il Perl 5.22.1, è:

perlbrew install-multiple 5.22.1 --both=thread