Warum ist eine Threaded-Version dieses speziellen Perl-Skripts 200 mal langsamer als sein Gegenstück ohne Threading?

8

Eine Präsentation von Mikhael Goikhman von einer Perl-Konferenz von 2003 enthält ein Paar Beispiele von Primzahlsuch-Skripten. Eins ist eingefädelt und die andere ist es nicht. Nach dem Ausführen der Skripts (Druckzeilen auskommentiert), habe ich eine Ausführungszeit von 0.011s auf der nicht-threaded-Version und 2.343 (!) Sekunden in der threaded-Version. Was für den erstaunlichen Unterschied in den Zeiten?

Ich habe einige Erfahrung mit Threads in Perl und habe schon bemerkt, dass Thread-Erstellungszeiten besonders brutal sein können, aber das scheint nicht der Engpass in Goikhams Beispiel zu sein.

    
Richard Simões 07.11.2009, 03:06
quelle

4 Antworten

11

Ich bin ein Python-Typ, nicht Perl, also habe ich nur eine vage Vorstellung davon, was der Code macht. Seien Sie jedoch immer vorsichtig, wenn Sie Warteschlangen sehen. Python hat eine thread-sichere Warteschlange, und es sieht so aus, als ob Perl es auch tut. Sie sind fantastisch darin, dass sie sich um Thread-Sicherheit für Sie kümmern, aber sie beinhalten typischerweise viel loses teures Sperren und Entsperren der Warteschlange, wo wahrscheinlich Ihre gesamte Zeit liegt.

>     
Jay P. 07.11.2009, 03:50
quelle
15

Jay P. hat Recht:

%Vor%

Vergleichen Sie das mit:

%Vor%     
bish 07.11.2009 04:05
quelle
7

Wie viele Prozessoren haben Sie? Im Allgemeinen wird jede rechenintensive Aufgabe langsamer ausgeführt, wenn # der Threads & gt; Anzahl der Prozessoren Dies liegt daran, dass es teuer ist, zwischen Threads zu wechseln ("Kontextwechsel"). Kontextwechsel umfassen das Anhalten von 1 Thread, das Speichern seines Kontexts und das Einfügen des Kontexts eines anderen Threads in den Prozessor, damit dieser ausgeführt werden kann. Und alles für was? Also kann Thread A berechnen, ob 12321 durch 7 statt durch Thread B teilbar ist?

Wenn du 2 Procs hast, würde ich wetten, dass eine Version mit 2 Threads die schnellste ist, 4 procs - & gt; Verwenden Sie 4 Threads usw.

    
noctonura 07.11.2009 03:17
quelle
2

Es ist ein bisschen ein pathologischer Fall. Die wirkliche Antwort lautet: Bevor Sie anfangen, Perl Ithreads zu verwenden, müssen Sie ein bisschen darüber wissen, wie die Dinge funktionieren. Sie sind notorisch ineffizient bei einigen Dingen (Daten teilen) und gut bei anderen (sie sind gleichzeitig).

Wenn die Arbeitsabschnitte, die Sie den Unterthreads überlassen, im Vergleich zu der Anzahl, mit der Sie Daten von einem Thread an einen anderen senden, um einen signifikanten Wert erhöht werden, würden die Dinge ganz anders aussehen.

Vergleiche mit Python-Threads wie Jay P: Wie er richtig sagt, sind Python-Threads kooperativ und laufen nur auf einem Kern. Perls iThreads sind sehr unterschiedlich. Sie können jeweils auf einem Kern laufen, aber dafür können sie bezahlt werden, da sie im Wesentlichen einen eigenen Interpreter pro Thread haben. Dies macht die Kommunikation zwischen Threads ähnlich der Kommunikation zwischen Prozessen, einschließlich des damit verbundenen Overheads.

    
tsee 08.11.2009 14:29
quelle

Tags und Links