23 votos

Roscado vs solo hilo

Es siempre la garantía de que una aplicación multiproceso podría correr más rápido que un solo subproceso de la aplicación?

Tengo dos hilos que rellena los datos de un origen de datos, pero diferentes entidades (por ejemplo: base de datos de dos tablas diferentes), parece que de un solo subproceso versión de la aplicación se ejecuta más rápido que la versión con dos hilos.

¿Por qué la razón de ser? cuando miro el monitor de rendimiento, tanto de la cpu s son muy puntiagudas ? es esto debido a que el cambio de contexto?

¿cuáles son las mejores prácticas a jack el CPU y utilizar plenamente?

Espero que esto no es ambigua.

61voto

Eric Lippert Puntos 300275

Una analogía podría ser de ayuda.

Usted tiene un montón de cartas usted necesita entregado a varias direcciones alrededor de la ciudad. Así que contrata a un chico con una moto para entregar sus cartas.

Las señales de tráfico en su ciudad son perfectas las señales de tráfico. Ellos siempre están verdes a menos que haya alguien en la intersección.

El chico de la motocicleta cremalleras alrededor de la entrega de un montón de cartas. Ya no hay nadie en la carretera, cada luz está en verde, que es impresionante. Pero creo hey, esto podría ser más rápido. Yo sé, yo voy a contratar a otro conductor.

Problemas *sólo tiene una motocicleta todavía. Así que ahora su primer controlador de unidades alrededor de la motocicleta por un tiempo, y luego cada ahora y, a continuación, se detiene, se baja, y el segundo conductor de carreras, saltos, y las unidades a su alrededor.

Es esto más rápido? No, claro que no. Eso es más lento. La adición de más hilos no hacer nada más rápido. Los hilos no son magia. Si un procesador es capaz de realizar millones de operaciones por segundo, la adición de otro hilo no de repente hacer otro billón de operaciones por segundo disponible. Más bien, se roba los recursos de otros subprocesos. Si una motocicleta puede ir de 100 millas por hora, parando la moto y tener otro conductor se en no hacerlo más rápido! Claramente, en promedio, las letras no se entregan más rápido en este esquema, simplemente están entregados en un orden diferente.

OK, así que ¿qué pasa si usted contrata a dos pilotos y dos motocicletas? Ahora tiene dos procesadores y el hilo de una por procesador, por lo que va a ser más rápido, ¿verdad? No, porque nos olvidamos de las luces de tráfico. Antes, sólo había una conducción de motocicletas a alta velocidad en cualquier momento. Ahora hay dos pilotos y dos motocicletas, lo que significa que ahora, a veces, una de las motocicletas tendrán que esperar porque la otra está en la intersección. De nuevo, la adición de más hilos te ralentiza debido a que pasan más tiempo en disputa bloqueos. El más procesadores de agregar, peor se pone, terminas con más y más el tiempo de espera ante un semáforo en rojo y menos y menos tiempo de conducción mensajes a su alrededor.

La adición de más subprocesos pueden causar negativo escalabilidad si al hacerlo provoca que los bloqueos que se sostuvo. El más hilos, los más de contención, el más lento ir las cosas.

Suponga que hacen los motores más rápido, ahora tiene más procesadores, más hilos, y procesadores más rápidos. ¿Que hacen siempre es más rápido? NO. Con frecuencia no. El aumento de la velocidad del procesador puede hacer programas multiproceso ir más lento. Pensemos de nuevo en el tráfico.

Supongamos que usted tiene una ciudad con miles de conductores y sesenta y cuatro motocicletas, los controladores de todos corriendo hacia atrás y adelante entre las motos, algunas de las motocicletas en las intersecciones de bloqueo de otras motos. Ahora todas aquellas motocicletas que se ejecute más rápido. ¿Eso ayuda? Así, en la vida real, cuando usted está conduciendo alrededor, tienes a dónde va el doble de rápido en un Porsche como en un Honda Civic? Por supuesto que no, la mayoría del tiempo en la conducción de la ciudad que usted está atascado en el tráfico.

Si usted puede conducir más rápido, a menudo terminan esperando en el tráfico de más porque te acaban de conducción en la congestión más rápido. Si todo el mundo lleva a la congestión más rápido, a continuación, la congestión empeora.

Multiproceso el rendimiento puede ser profundamente contradictorio. Si desea extrema de alto rendimiento recomiendo no ir con un multiproceso solución a menos que tenga una aplicación con la que es "paralela", es decir, una aplicación que es, obviamente, susceptibles de lanzar múltiples procesadores, como la computación de los conjuntos de Mandelbrot o haciendo el trazado de rayos o algo parecido. Y entonces, no tiren más hilos en el problema que usted tiene procesadores. Pero para muchas aplicaciones, la partida más hilos te ralentiza.

9voto

Lirik Puntos 17868

Mi Opinión

No, no es garantía de que una aplicación multiproceso podría correr más rápido que un solo subproceso de la aplicación. El principal problema es la distribución adecuada de la carga de trabajo para todos los núcleos disponibles y minimizar el bloqueo y el cambio de contexto.

Creo que algunas de las peores cosas que la gente puede hacer es ir y tratar de multithread cada pedacito de su uso intensivo de la CPU de tareas. A veces, terminan creando cientos de hilos y cada hilo está tratando de realizar una gran cantidad de uso intensivo de la CPU cálculos. La mejor cosa a hacer en esa situación es la creación de una (o quizás dos) hilos por núcleo.

En los casos donde hay una interfaz de usuario que intervienen casi siempre prefería delegar todo el trabajo intensivo de CPU en los hilos en el fin de mantener la interfaz de usuario sensible. Este es probablemente el uso más popular para los subprocesos.

...parece como la única versión roscada de la aplicación se ejecuta más rápido que la versión con dos hilos.

Han ejecutó cualquier análisis de rendimiento? Si usted no tiene, entonces, lo que hemos observado es algo irrelevante.

¿cuáles son las mejores prácticas a jack la CPU y utilizar plenamente?

Dada la descripción de su problema que no parece que sus problemas de rendimiento son la CPU, pero dependiente de e/S... su comunicación con la base de datos es mucho más lento que su caché del procesador y si es una red de base de datos, entonces es incluso más lento que el disco duro. Su cuello de botella de rendimiento es con la base de datos, así que todo lo que necesitas hacer es crear suficientes hilos para maximizar el rendimiento de su conexión a la base de datos.


Directamente de la Wikipedia:

Ventajas

Algunas de las ventajas incluyen:

  • Si un hilo que recibe una gran cantidad de errores de caché, el hilo de otro(s) no puede continuar tomando ventaja de la falta de los recursos informáticos, lo que puede conducir a una más rápida ejecución, ya que estos recursos han sido inactivo si un solo hilo fue ejecutado.
  • Si un hilo no puede utilizar todos los recursos informáticos de la CPU (porque las instrucciones dependen unos de otros del resultado), la ejecución de otro hilo permisos para no dejar estas inactivo.
  • Si varios hilos trabajar en el mismo conjunto de datos, que en realidad puede compartir su caché, que conduce a un mejor uso de la caché o la sincronización de sus valores.

Desventajas

Algunas críticas de subprocesamiento múltiple incluyen:

  • Varios subprocesos pueden interferir unos con otros a la hora de compartir los recursos de hardware, tales como depósitos o translation lookaside buffers (TLBs).
  • Los tiempos de ejecución de un único hilo no se ha mejorado, pero pueden ser degradados, incluso cuando sólo uno de los thread que se está ejecutando. Esto es debido a un menor de frecuencias y/o canalización de las etapas que son necesarias para acomodar el hilo de cambio de hardware.
  • Soporte de Hardware para el Multithreading es más visible para el software, por lo que requieren más cambios, tanto a los programas de aplicación y los sistemas operativos de Multiprocesamiento.

Actualización

Además, el servidor de base de datos en el misma máquina en que se ejecuta el código. s no es un sql server. es una nosql dbms. así que por favor no asuma nada sobre la base de datos del servidor.

Algunos NoSQL son los sistemas basados en discos y la lectura del disco de múltiples hilos, es casi garantizado para disminuir el rendimiento. El disco duro puede tener que mover la cabeza a los diferentes sectores de la disco al saltar entre los hilos y eso es malo!

Entiendo el punto al que quería hacer es la e / s de velocidad. pero aún s la misma máquina. por qué IO Es tan lento ?

Su NoSQL sistema puede estar basado en disco, por lo tanto, todos los datos se almacenan en el disco en lugar de cargar en memoria (como SQL Server). Además de pensar acerca de la arquitectura: el disco es un caché de memoria RAM, la memoria RAM se almacena en caché el caché de CPU, y la caché de CPU, es para los registros de la CPU. Así de Disco -> Ram -> caché de CPU -> Registros, hay 3 niveles de almacenamiento en caché antes de llegar a los registros. Dependiendo de la cantidad de datos que está utilizando, usted podría estar recibiendo una gran cantidad de errores de caché para ambos hilos en cada uno de esos niveles... un error de caché en la caché de CPU va a cargar más datos de la memoria RAM, un error de caché en RAM va a cargar más datos desde el disco, todo esto se traduce en un rendimiento reducido.

en otros críticos "crear suficiente hilos a utilizar .." la creación de muchos los hilos también llevará su tiempo. a la derecha?

En realidad no... sólo tiene dos hilos. ¿Cuántas veces se va a crear los hilos? ¿Con qué frecuencia se va a crear? Si sólo está la creación de dos hilos y estás haciendo todo su trabajo en estos dos hilos para toda la vida útil de la aplicación, entonces prácticamente no hay sobrecarga de rendimiento a partir de la creación de los hilos que usted debe estar preocupado.

3voto

Fu4ny Puntos 497

Si su programa es de e/S pesado y pasar más tiempo de espera de e/S (como la operación de base de datos), de modo de subprocesamiento no iba a correr más rápido.

Si hacer mucho cálculo en la CPU, por lo que se han beneficiado o no, depende de cómo se escribe.

2voto

Matthew Flaschen Puntos 131723

Por supuesto que no. Roscado impone una sobrecarga, por lo que si la aplicación de beneficios depende de cómo paralelo es.

1voto

vodkhang Puntos 11222

No, no lo es. Porque cuando haces el multithreading, la CPU tiene que cambiar entre hilo, memoria, registro, y que los costos. Hay algunos taks que son divisibles como la combinación de tipo, pero hay algunas tareas no pueden ser divisible en sub tareas como la comprobación de si un número es primo, o no (que es sólo mi repentina ejemplo) y, a continuación, si se intenta separar a cabo, que sólo se ejecuta como un hilo único problema.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X