2009-11-14 14 views
5

¿Alguien sabe aproximadamente cuál es el tamaño de trabajo mínimo necesario para que una goroutine sea beneficiosa (suponiendo que hay núcleos libres para el trabajo que se va a descargar)?tamaño mínimo de trabajo de una goroutine

+0

Es probable que obtener una mejor respuesta en la lista de correo Ir: http://groups.google.com/group/golang-nuts/ –

+2

@RCIX: sí, ver http: // golang. org/doc/effective_go.html # goroutines –

Respuesta

3

He estado trabajando a través del proyecto euler con Go. Aunque no tengo una respuesta definitiva para usted, encontré que el tamiz de primalidad basado en goroutine en los documentos Go es un orden de magnitud más lento que el simple hecho de comprobar la primalidad de cada número. Establecer GOMAXPROCS a un valor más alto tampoco ayudó.

+2

La paralelización solo ayuda con la velocidad si los resultados son independientes o se pueden dividir en fragmentos independientes. Sin embargo, el primer tamiz depende explícitamente de los resultados anteriores: no es realmente paralelo si todos menos uno de los goroutines están bloqueando en un momento dado. –

4

goroutine es una abstracción que puede usar si le ayuda a modelar mejor su aplicación. Está haciendo una programación orientada a la concurrencia, piense en las partes de su aplicación que tienen concurrencia dentro de ellas.

Piense en un sistema OO e imagínese hacer la misma pregunta sobre si debe instanciar un objeto.

Haga lo que tiene sentido primero.

+0

Exactamente, los goroutines son "solo" una abstracción conceptual muy útil para organizar sus programas. Que ayudan a aumentar el rendimiento haciendo simple la paralelización es solo un buen efecto secundario. – uriel

1

Los goroutines son livianos y no ocupan muchos recursos. Debe usarlos donde sea apropiado para el problema. Actualmente, ir no parece ser excepcionalmente bueno para usar núcleos múltiples (parece que hay demasiada sobrecarga en la asignación de subprocesos de host adicionales).

Creo que la verdadera pregunta es cuándo usar varios núcleos en lugar de cuándo usa goroutines. La respuesta a eso es probablemente la misma que para otros lenguajes y procesos host adicionales. (Desafortunadamente, no se puede especificar fácilmente cuándo una rutina debe ocupar un nuevo proceso de host o qué proceso debe ocupar).

+1

go-routines en realidad no asignan nuevos subprocesos ya que las rutinas se mutiplexan sobre subprocesos existentes del sistema. Básicamente se reduce a cuándo es beneficioso usar múltiples núcleos; sin embargo, la respuesta no será la misma que en otros lenguajes, ya que otros lenguajes comparables (c, C++, java) no tienen una construcción paralela incorporada y tienen que ser administrados manualmente o usar una construcción previa al compilador como openMP – Mark

+0

Sí, Entiendo que. Mi post comenta el hecho de que el número de procesos de host debe ser limitado cuando se usan rutinas en situaciones donde la asignación de procesos de host es inapropiada. –

1

El uso de rutinas no solo se trata de la eficiencia del hardware. Algunas veces hacen que el software sea más fácil de escribir y hacen que sea más fácil evitar errores. El lenguaje le permite al programador expresar concurrencia de forma natural y simple. Eso vale mucho para mí.

Mi propia experiencia con los problemas que son candidatos naturales para la concurrencia es que ir me permite maximizar al máximo todos los núcleos disponibles en problemas de CPU usando un enfoque trivial de "dispersión/recopilación". Su experiencia puede ser diferente.

Hotei

Cuestiones relacionadas