Re: n Prozesse starten - Computer Language Shootout

Enrico Schwass <[email protected]> Mon, 18 Oct 2004 10:24:51 +0200
Newsgroups gmane.comp.lang.ruby.german
Message-ID <[email protected]>
Hallo Michael

 >Weisst du warum das so langsam ist? Du solltest keine Zufallszahlen
 >verwenden. Denn, dann kannst du lange warten bis alle beendet sind.

:) Beim Benchmark habe ich nat=FCrlich diese Zeilen auskommentiert.

 >Ausserdem, es l=E4uft ja immer nur ein Thread, und es kann gut sein, da=
s

Hmm... das w=FCrde ja der Intention von threads widersprechen. Ach du
meinst weil der Prozessor immer nur jeweils einen in der Zeitscheibe
abarbeitet.

 >du "check" mehrmals zuweist, bevor =FCberhaupt ein anderer Thread an di=
e
 >Reihe kommt um zu pr=FCfen ob er sich nun beenden soll.

Ja, stimmt. Zum Benchmark sah das Programm auch eher so aus. Das
erf=FCllt die Aufgabenstellung =E4ndert aber nat=FCrlich nichts an der sc=
hlechten
Performance.

 > threads =3D []
 >
 > # Anzahl der Threads als Argument
 >
 > n =3D ARGV[0].to_i
 >
 > # Condition variable
 >
 > check =3D 0
 >
 > for t in 1..n
 >  threads << Thread.new(t) { |my_t|
 >    loop do
 >      break if my_t =3D=3D check
 >    end
 >  }
 > end
 > check =3D 1 # beende zur Demonstration den ersten Thread
 > # bei Programmende enden alle Threads

 > Ich habe das ganze mal mit Mutexes geschrieben:

Die Idee hatte ich kurz darauf. Versprach mir allerdings keinen=20
Geschwindigkeitsvorteil.
Wenn du aber berichtest, das du 1000 Threads in 2 Sekunden laufen l=E4sst=
=20
ist das eine ganz
erhebliche Steigerung. Interessant.

 >Das erste Beispiel dauert bei mir bei 1000 Threads so ca. 2 Sekunden.
 >Das zweite nur 1,5. Und wenn du das t.join direkt hinter t.wakeup setzt=
,
 >dann ist es nochmals doppelt so schnell.

Da die Threads durchaus mit dem Hauptprogramm beendet werden k=F6nnen,
hatte ich auf das join verzichtet. Ich schau mir deine Beispiele in=20
aller Ruhe an und melde
mich dann wieder.

Bis die Tage
Enno