2012-08-16 11 views
16

Estoy investigando el tiempo que tarda una operación concreta en completarse. La operación es similar a la siguiente:La aplicación se ejecuta más rápido con el análisis de rendimiento de estudio visual

Parallel.ForEach(items, item => SaveScheme(item)); 

El método SaveScheme trabaja con una base de datos: ejecuta algunas consultas y trabaja con la información. La cantidad de elementos en la colección items puede ser lo suficientemente grande.

Cuando ejecuto esta operación, demora unos 20-40 segundos en completarse. Pero cuando lo ejecuto con un perfil activado, ¡solo lleva 3 segundos!

No se encontró información sobre este problema. Mi única conjetura es que con el perfil Parallel.ForEach crea más hilos que sin él, pero no estoy seguro, e incluso si es cierto, no sé qué hacer con él.

Entonces, ¿por qué sucede eso y cómo puedo obtener este rendimiento cuando ejecuto la aplicación sin crear perfiles?


UPD. Parallel no tiene nada que ver con esto: ¡Probé con el simple foreach y la operación aún se completa en 3 segundos!

+0

hmm Extraño, en realidad se ralentizará ... – Anuraj

+0

¿Has probado el Visualizador de Concurrencia? – h1ghfive

+0

He probado el Visualizador de Concurrencia, pero lo que vi allí no me dice nada. Sé cuántos hilos hay, etc., pero sin profiler no sé qué sucede cuando la operación dura 40 segundos. Entonces, no puedo compararlo. – STiLeTT

Respuesta

30

he encontrado la respuesta:

La razón es porque cuando se ejecuta la aplicación en Visual Studio , el depurador se adjunta a la misma. Cuando lo ejecuta utilizando el generador de perfiles , el depurador no está conectado.

Si intenta ejecutar el .exe por sí mismo, o ejecutar el programa a través el IDE con el "Test> Iniciar sin depurar" (o simplemente pulse Ctrl + F5) la aplicación debe correr tan rápido como lo hace con el perfilador.

https://stackoverflow.com/a/6629040/1563172

no he encontrado que antes porque pensé que la razón es la simultaneidad.

+0

Tenga en cuenta que si se quiere ejecutar secuencias de comandos en la consola interactiva (por ejemplo, para obtener los beneficios de IPython), puede separar el depurador a través de Python Herramientas -> Interactivo Ventana -> desmarque "Habilitar la conexión a la ventana interactiva" y obtenga la misma velocidad. – Leo

0

Podría ser que en perfiles que ha ralentizado (y la disminución de la concurrencia) de la generación de trabajo base de datos real que ha estrangulado con eficacia el cuello de botella en sí - sí la base de datos (o ....).

+0

He actualizado la cuestión - la concurrencia no es la razón ... – STiLeTT

0

Este resultado sugiere que su aplicación es quizás tratando de ser demasiado concurrente: sus hilos son, de hecho, interponiéndose en el camino podían tú, o la sobrecarga de crear sus hilos es mayor que cualquier ganancia de rendimiento. ¡Esto se evidencia por el hecho de que su versión no concurrente se ejecuta más rápido!

El uso del generador de perfiles afectará el rendimiento de su aplicación; tal vez esté ralentizando su código lo suficiente como para que haga vea algún beneficio de varios hilos.

Sin más detalles del código detrás de su método, esta parece ser la respuesta más probable.

Cuestiones relacionadas