2009-11-14 6 views
5

Weiß jemand ungefähr, wie groß die minimale Arbeitsgröße ist, damit eine Goroutine von Vorteil ist (vorausgesetzt, es gibt freie Kerne für die Arbeit, die ausgelagert werden sollen)?minimale Arbeitsgröße einer Goroutine

+0

Sie würden wahrscheinlich eine bessere Antwort auf die Mailingliste Go erhalten: http://groups.google.com/group/golang-nuts/ –

+2

@RCIX: ja, siehe http: // golang. org/doc/effective_go.html # goroutines –

Antwort

3

Ich habe durch Projekt Euler mit Go gedrängt. Während ich keine definitive Antwort für Sie habe, fand ich das Goroutine-basierte Primalitätssieb in den Go-Dokumenten um eine Größenordnung langsamer als einfach jede Zahl auf Primalität zu überprüfen. Auch das Einstellen von GOMAXPROCS auf einen höheren Wert hat nicht geholfen.

+2

Die Parallelisierung hilft nur mit der Geschwindigkeit, wenn die Ergebnisse unabhängig sind, oder sie kann in unabhängige Teile aufgeteilt werden. Das Prime-Sieb hängt jedoch explizit von den vorherigen Ergebnissen ab: Es ist nicht wirklich parallel, wenn alle bis auf eine der Goroutinen zu einem bestimmten Zeitpunkt blockieren. –

4

Goroutine ist eine Abstraktion, die Sie verwenden, wenn es Ihnen hilft, Ihre Anwendung besser zu modellieren. Sie führen Concurrency-orientierte Programmierung durch, also denken Sie über die Teile Ihrer Anwendung nach, die in ihnen Concurrency haben.

Denken Sie an ein OO-System und stellen Sie sich die gleiche Frage, ob Sie ein Objekt instanziieren sollen.

Tun Sie das, was zuerst Sinn macht.

+0

Genau gesagt, sind Gououtlines "nur" eine sehr nützliche konzeptionelle Abstraktion, um Ihre Programme zu organisieren. Dass sie zur Leistungssteigerung beitragen, indem sie die Parallelisierung vereinfachen, ist nur ein netter Nebeneffekt. – uriel

1

goroutines sind leicht und nehmen nicht viel Ressourcen auf. Sie sollten sie verwenden, wo immer es für das Problem geeignet ist. Momentan scheint es nicht besonders gut zu sein, mehrere Kerne zu verwenden (es scheint ein bisschen zu viel Aufwand bei der Zuweisung zusätzlicher Host-Threads zu sein).

Ich denke, die wahre Frage ist, wann mehrere Kerne anstatt wann zu verwenden Verwende Göroutinen. Die Antwort darauf ist wahrscheinlich dieselbe wie für andere Sprachen und zusätzliche Host-Prozesse. (Leider können Sie nicht einfach angeben, wann eine Goroutine einen neuen Host-Prozess belegen sollte oder welchen Prozess sie belegen sollte.)

+1

Go-Routinen zuweisen nicht wirklich neue Threads, da die Routinen über vorhandene Systemthreads multiplexed sind. Es kommt grundsätzlich darauf an, wann es sinnvoll ist, mehrere Kerne zu verwenden; Die Antwort ist jedoch nicht die gleiche wie bei anderen Sprachen, da andere vergleichbare Sprachen (c, C++, java) kein integriertes Parallel-Konstrukt haben und manuell verwaltet werden müssen oder ein Pre-Compiler-Konstrukt wie openMP verwenden. – Mark

+0

Ja, Ich verstehe das. In meinem Beitrag wird darauf hingewiesen, dass die Anzahl der Host-Prozesse begrenzt sein sollte, wenn in Situationen, in denen die Zuweisung von Host-Prozessen unangemessen ist, Goroutines verwendet werden. –

1

Bei der Verwendung von goroutines geht es nicht nur um die Hardware-Effizienz. Manchmal machen sie die Software einfacher zu schreiben und es ist einfacher, Fehler zu vermeiden. Die Sprache erlaubt dem Programmierer, Nebenläufigkeit natürlich und einfach auszudrücken. Das ist mir sehr viel wert.

Meine eigene Erfahrung mit Problemen, die natürliche Kandidaten für Nebenläufigkeit sind, ist, dass es mir leicht ermöglicht, alle verfügbaren Kerne auf CPU-gebundenen Problemen mit einem trivialen "Scatter/Gather" -Ansatz zu maximieren. Ihre Laufleistung kann variieren.

Hotei