visual studio slow rendimiento rapido optimizar muy mejorar mas lento improve como acelerar c# .net performance parallel-processing profiling

c# - slow - La aplicación se ejecuta más rápido con el análisis de rendimiento de Visual Studio



visual studio 2017 muy lento (4)

Estoy investigando la cantidad de tiempo que tarda una operación en particular en completarse. La operación es como la siguiente:

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

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

Cuando ejecuto esta operación, toma alrededor de 20-40 segundos completarla. Pero cuando lo ejecuto con un perfil activado, ¡toma solo 3 segundos!

No encontré ninguna información sobre este problema. Mi única suposición es que con el perfil Parallel.ForEach crea más subprocesos 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 archivar este rendimiento cuando ejecuto la aplicación sin crear perfiles?

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


¿Podría ser que en la creación de perfiles ha disminuido la velocidad (y disminuyó la concurrencia) de la generación de trabajo de la base de datos real, ya que ha estrangulado efectivamente el cuello de botella? Sí, la base de datos (o ...).


Este resultado sugiere que su aplicación quizás esté tratando de ser demasiado concurrente: sus subprocesos de hecho se están interponiendo entre sí, o la sobrecarga de crear sus subprocesos es mayor que cualquier ganancia de rendimiento. Esto se evidencia en 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 ver algunos beneficios de los múltiples subprocesos.

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


He encontrado la respuesta:

La razón es porque cuando ejecuta su aplicación dentro de Visual Studio, el depurador se adjunta a ella. Cuando lo ejecuta utilizando el generador de perfiles, el depurador no se adjunta.

Si intenta ejecutar el archivo .exe por sí mismo, o ejecutar el programa a través del IDE con "Depurar> Iniciar sin depurar" (o simplemente presionar Ctrl + F5), la aplicación debería ejecutarse tan rápido como lo hace con el generador de perfiles.

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

No lo encontré antes porque pensé que la razón es la concurrencia.