Re: Re: n Prozesse starten - Computer Language Shootout
Michael Neumann <[email protected]> Mon, 18 Oct 2004 10:53:11 +0200
| Newsgroups | gmane.comp.lang.ruby.german |
|---|---|
| Message-ID | <[email protected]> |
On Mon, Oct 18, 2004 at 10:24:51AM +0200, Enrico Schwass wrote:
> Hallo Michael
>=20
> >Weisst du warum das so langsam ist? Du solltest keine Zufallszahlen
> >verwenden. Denn, dann kannst du lange warten bis alle beendet sind.
>=20
> :) Beim Benchmark habe ich nat=FCrlich diese Zeilen auskommentiert.
>=20
> >Ausserdem, es l=E4uft ja immer nur ein Thread, und es kann gut sein, d=
as
>=20
> Hmm... das w=FCrde ja der Intention von threads widersprechen. Ach du
> meinst weil der Prozessor immer nur jeweils einen in der Zeitscheibe
> abarbeitet.
Ist aber so. Die laufen in Wirklichkeit nur quasi-parallel.
> >du "check" mehrmals zuweist, bevor =FCberhaupt ein anderer Thread an d=
ie
> >Reihe kommt um zu pr=FCfen ob er sich nun beenden soll.
>=20
> Ja, stimmt. Zum Benchmark sah das Programm auch eher so aus. Das
> erf=FCllt die Aufgabenstellung =E4ndert aber nat=FCrlich nichts an der =
schlechten
> Performance.
>=20
> > 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
>=20
> > Ich habe das ganze mal mit Mutexes geschrieben:
>=20
> 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=E4s=
st=20
> ist das eine ganz
> erhebliche Steigerung. Interessant.
Das liegt wohl daran, das meine Threads keine Anweisungen ausf=FChren, un=
d
somit keine anderen Threads vor dem Ablaufen blockieren. Was du machst,
nennt sich "busy-waiting", und das ist "teuer". Blockierte Threads
werden gar nicht neu ge-scheduled, d.h. neben keine Zeit aus der
Zeitscheibe weg.
> >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 setz=
t,
> >dann ist es nochmals doppelt so schnell.
>=20
> 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.
Hm, die Aufgabenstellung von shootout ist dahingehen sehr
undurchsichtig.=20
Gr=FCsse,
Michael