Este artículo proviene de un motor de traducción automática.
Rendimiento de los subprocesos
Generación de perfiles de simultaneidad de contención de recursos de Visual Studio 2010
Maxim Goldin
Como los procesadores multinúcleo son cada vez más habituales, los desarrolladores de software va a crear aplicaciones multiproceso que aprovechan la capacidad de procesamiento adicional para conseguir un mejor rendimiento.Con la eficacia de los subprocesos en paralelo, puede dividir el trabajo total en tareas independientes y ejecutar las tareas en paralelo.
Subprocesos, sin embargo, a menudo necesitan comunicarse entre sí para completar una tarea y, a veces se necesita sincronizar su comportamiento si lo requiere el acceso de un algoritmo o datos.Por ejemplo, debe concederse acceso simultáneo de escritura a los mismos datos a los subprocesos de manera mutuamente exclusiva para evitar la corrupción de datos.
Sincronización con frecuencia se lleva a cabo mediante el uso de objetos de sincronización compartido, cuando el subproceso adquirir el objeto se conceda el acceso compartido o exclusivo para el código confidencial o datos.Si ya no se requiere el acceso, el subproceso de renuncia de propiedad y otros subprocesos pueden intentar obtener acceso.En función del tipo de sincronización utilizado, solicitudes simultáneas para la propiedad podrían permitir que varios subprocesos tener acceso a los recursos compartidos al mismo tiempo, o algunos de los subprocesos podrían bloquearse hasta que se libere el objeto de adquisición anterior.Ejemplos include secciones críticas de C o C++ que utilizan las rutinas de acceso de EnterCriticalSection y LeaveCriticalSection, la función WaitForSingleObject de C o C++ y la instrucción de bloqueo y la clase Monitor en C#.
La elección del mecanismo de sincronización debe realizar con cuidado, ya que la sincronización incorrecta entre subprocesos puede reducir en lugar de aumentar las ganancias de rendimiento que son el objetivo de subprocesamiento múltiple.Por lo tanto, resulta cada vez más importante poder detectar situaciones en que los subprocesos bloqueados debido a contención de bloqueo que no avanzar.
Las herramientas de rendimiento en 2010 de Visual Studio incluyen un nuevo método de generación de perfiles: generación de perfiles de contención de recursos, que le ayuda a detectar los conflictos de simultaneidad entre subprocesos.Puede encontrar un excelente primer vistazo a esta función en la entrada de blog de Wintellect ’ John Robbins en wintellect.com/CS/blogs/jrobbins/archive/2009/10/19/vs-2010-beta-2-concurrency-resource-profiling-in-depth-first-look.aspx de .
En este artículo, me guiará a través de una investigación de generación de perfiles de contención y explicar a los datos que se pueden recopilar mediante el IDE de Visual Studio 2010 y herramientas de línea de comandos.También explicaré cómo puede analizar los datos de Visual Studio de 2010, y aprenderá a mover desde la vista de análisis de uno a otro al llevar a cabo la investigación de contención.A continuación, corregirá el código y comparar los resultados de la aplicación modificada con los resultados de generación de perfiles originales para validar que la corrección reduce el número de contención de generación de perfiles.
Iniciar con el problema.
Por ejemplo, voy a usar la misma aplicación de multiplicación de matriz Hazim Shafi utilizado en su blog “ 1 del modelo de rendimiento: Identificación de contención de bloqueo ” (blogs.msdn.com/hshafi/archive/2009/06/19/performance-pattern-1-identifying-lock-contention.aspx de ).En el ejemplo de código está escrito en C++, pero los conceptos que abordaré son igualmente aplicables al código administrado.
El ejemplo de aplicación de multiplicación de matriz utiliza varios subprocesos para multiplicar dos matrices.Cada subproceso obtiene una parte del trabajo y ejecuta el siguiente fragmento de código:
for (i = myid*PerProcessorChunk;
i < (myid+1)*PerProcessorChunk;
i++) {
EnterCriticalSection(&mmlock);
for (j=0; j<SIZE; j++) {
for (k=0; k<SIZE; k++) {
C[i][j] += A[i][k]*B[k][j];
}
}
LeaveCriticalSection(&mmlock);
}
Cada subproceso tiene su propio identificador (myid) y es responsable de calcular el número de filas (una o más) en la matriz resultante C, uso de matrices A y B como entrada. Control de código Cerrar muestra que no ocurre realmente ambiguo escritura compartido, y cada subproceso que se escribe en una fila distinta de C. Aún el desarrollador decide protegerse de la asignación a la matriz con una sección crítica. Gracias al desarrollador para esto, como me proporciona una buena oportunidad para demostrar las nuevas herramientas de rendimiento de 2010 de Visual Studio para encontrar fácilmente la sincronización redundante.
Recopilación de datos de generación de perfiles
Suponiendo que dispone de un proyecto de Visual Studio con el código mostrado anteriormente (aunque no es necesario, puede asociar el generador de perfiles para cualquier aplicación que ya se está ejecutando), se inicia la contención de generación de perfiles, haga clic en iniciar el Asistente de rendimiento en el menú de análisis.
En la primera página del asistente, que se muestra en de figura 1, elija la simultaneidad y asegúrese de que esté activada la opción “ recopilar datos de la contención de recursos ”. Tenga en cuenta que simultaneidad de contención de recursos funciona en cualquier versión del sistema operativo Windows de la generación de perfiles. La opción “ visualizar el comportamiento de una aplicación multiproceso ” requiere Windows Vista o Windows 7.
Figura 1 de la generación de perfiles de recursos de la habilitación de concurrencia
En la segunda página del asistente, asegúrese de que se dirige el proyecto actual. En la última página del asistente, compruebe que esté activada la opción “ Iniciar después de finalizar el Asistente de generación de perfiles ”, a continuación, haga clic en Finalizar. La aplicación comienza a ejecutarse bajo el generador de perfiles. Cuando se cierra, el archivo de datos de generación de perfiles, aparece en la ventana del explorador de rendimiento (consulte de figura 2).
La figura 2 del archivo de resultados en el Explorador de rendimiento de generación de perfiles de rendimiento
El informe de generación de perfiles automáticamente se abre en Visual Studio y muestra los resultados de la investigación de rendimiento de la vista de resumen, que se muestra en de figura 3.
La figura 3 de vista de resumen del informe de generación de perfiles de
Análisis de datos de generación de perfiles
No toda la sincronización hace que la contención de bloqueo. Si hay un bloqueo, un intento para tener una propiedad del bloqueo no impide la ejecución de subprocesos y se produce sin conflictos. En el modo de generación de perfiles de contención de recursos, el generador de perfiles recopila los datos sólo para los eventos de sincronización que provocan el conflicto y no informa de las adquisiciones de recursos (desbloquear) correcta. Si la aplicación no hace que cualquier contención, no se recopilará ningún dato. Si recibe datos, significa que la aplicación tiene la contención de bloqueo.
Para cada conflicto, los informes del generador de perfiles que el subproceso se bloqueó, donde se ha producido la contención (pila de llamadas y de recursos), cuando la contención se produjo (timestamp) y la cantidad de tiempo (longitud) que el subproceso se ha bloqueado de tratar de adquirir un bloqueo, especifique una sección crítica, espere a que un único objeto y así sucesivamente.
Cuando se abre el archivo, primero verá la vista de resumen ( de figura 3), con tres áreas principales que se puede utilizar para realizar diagnósticos breves:
- El gráfico de contención, muestra el número de contención por segundo que se representan para el período de duración de la aplicación. Puede inspeccionar los picos de contención o seleccione un intervalo de tiempo y bien visualmente acercar, o filtrar los resultados. El filtrado re-analyzes los datos y quita los datos fuera del intervalo seleccionado.
- La tabla de recursos para tratar más muestra una lista de los recursos que ha causado la contención más detectados.
- La tabla de subprocesos para tratar más muestra una lista de los subprocesos con el número más alto de contención. Esta tabla utiliza el número de contención como criterio, no la longitud de la contención. Por lo tanto, es posible que tenga un subproceso bloqueado en una sola contención durante mucho tiempo, pero no se mostrarán en la vista de resumen. Por otra parte, se podría presentar un subproceso que se ha excedido el número contención muy corto, con cada contención de bloqueo del subproceso para sólo un poco tiempo, en la vista de resumen.
Si ve un recurso que se encarga de la mayoría de contención, inspeccionar ese recurso con más detalle. Si observa que un subproceso que experimenta un gran número de contención que no esperaba, compruebe la contención del subproceso.
Por ejemplo, en de figura 3, puede ver que la sección crítica (1) es responsable de la contención de casi todos los (99.90 por ciento) de la aplicación. Let’s investigar más detenidamente ese recurso.
Los nombres de recursos y los identificadores de subproceso en la vista de resumen son hipervínculos. Al hacer clic en los detalles de recursos ve (consulte de figura 4), donde se establece el contexto para el recurso específico de transferencias de sección crítica, 1: 1 de sección crítica.
La figura 4 de vista de detalles de recursos
Detalles de recursos
La parte superior de la vista de detalles de recursos, muestra un gráfico de basándose en el tiempo donde corresponda a cada línea horizontal a un subproceso. Las líneas tienen la etiqueta por la función de la raíz de subproceso a menos que el nombre del subproceso administrado en el código (por ejemplo, mediante la propiedad System.Threading.Thread.Name de C#). Un bloque de esta línea representa una contención del subproceso en el recurso. La longitud del bloque es la longitud de contención. Bloques de líneas diferentes es posible que se superponen en el tiempo, lo que significa que varios subprocesos bloqueados en el recurso al mismo tiempo.
La línea total es especial. No pertenece a ningún subproceso específico, pero contiene toda la contención de todos los subprocesos de este recurso (es realmente una proyección de bloques de contención para la línea). Como puede observar, 1 de sección crítica estaba muy ocupado, parece que no tiene ranuras vacías en su línea total.
Puede acercar una parte específica del gráfico al seleccionar un intervalo de tiempo con el botón secundario del mouse (primario en el punto en el gráfico que desee iniciar y, a continuación, arrastre el puntero hacia la derecha). Existen dos vínculos en la parte superior derecha del gráfico, zoom se restablece y alejar. Zoom Restablecer restaura la vista del gráfico original. Alejar tiene que volver paso a paso, un-zooming el gráfico del mismo modo que se aplica el zoom.
El patrón general de los bloques de contención que podría dar lugar a algunas conclusiones acerca de la ejecución de la aplicación. Por ejemplo, puede ver que la contención de varios subprocesos está muy superpuesta en el tiempo, lo que indica a un menor que la puesta en paralelo óptima. Cada subproceso se bloquea en el recurso mucho más tiempo del que se está ejecutando y, aún es otra indicación de la ineficacia de la aplicación.
Detalles de función
La parte inferior de la vista de detalles de recursos es una pila de llamadas de contención: no se mostrará ningún dato hasta que seleccione una contención concreta. Cuando se selecciona un bloque, la pila correspondiente se muestra en el panel inferior. También puede pasar por encima de un bloque de contención en el gráfico sin hacer clic en ella, y una ventana emergente le proporcionará la pila y la longitud de contención.
Como puede ver en la pila de llamadas de contención, una de las funciones de aplicación de ejemplo llamado MatMult está en la lista, por lo que sabe que era la causa de la contención. Para determinar qué línea de código del función es responsable de la contención, haga doble clic en el nombre de función en el panel de la pila de llamadas. Que le lleva a la vista de detalles de la función, que se muestra en de figura 5.
La figura 5 de la vista de detalles de función
En esta vista puede ver una representación gráfica de las funciones que llamaron a MatMult, así como funciones llamadas dentro del mismo. En la sección inferior de la vista muestra claramente que EnterCriticalSection(&mmlock) es responsable de los subprocesos se bloqueen todo el tiempo.
Cuando sepa qué línea del código es el responsable de contención, puede considerar la decisión de implementar la sincronización de este modo. ¿Es la mejor manera de proteger el código? ¿Es necesario de protección en absoluto?
En la aplicación de ejemplo, el uso de una sección crítica en este código no es necesario porque los subprocesos no comparten la escritura a las mismas filas de la matriz de resultados. Las herramientas de rendimiento de Visual Studio le ofrecen el punto donde puede comentar el uso de mmlock, acelerar considerablemente de la aplicación. Si sólo eran siempre es fácil!
Para obtener una descripción más detallada de la vista de detalles de la función, consulte el blog del equipo de Visual Studio Profiler en blogs.msdn.com/profiler/archive/2010/01/19/vs2010-investigating-a-sample-profiling-report-function-details.aspx de .
Detalles de subprocesos
Como he mencionado anteriormente, la vista de resumen ofrece un buen punto de partida para la investigación. Si examina las tablas de recursos para tratar más y más subprocesos de tratar, puede decidir cómo continuar. Si observa que uno de los subprocesos parece sospechosa debido a no espera que esté en la lista superior de subprocesos contended, podría decidir que el subproceso de una visión más detallada.
Haga clic en el identificador de subproceso en la vista de resumen para saltar a los detalles de subprocesos ver (consulte de figura 6). Aunque esta vista es similar a la vista de detalles de recursos, tiene un significado diferente porque muestra contención en el contexto del subproceso seleccionado. Cada línea horizontal representa un recurso que el subproceso se combatir para durante el período de duración del subproceso. En este gráfico no se verán los bloques de contención de superposición en el tiempo debido a significaría que el mismo subproceso se bloqueó en más de un recurso al mismo tiempo.
La figura 6 de la vista de detalles con seleccionados contención de bloqueo de subprocesos
Tenga en cuenta que WaitForMultipleObjects (que no estoy mostrando aquí) se controla por separado y se representa con una línea de gráfico único para el conjunto de objetos. Esto es debido a que el generador de perfiles trata todos los objetos de parámetro de WaitForMultipleObjects como una única entidad.
Las modificaciones que puede hacer en la vista de detalles de recursos (acercar o alejar el gráfico de entrada y salida, contención concreta de la selección y visualización de la duración en milisegundos y la pila de llamadas) son aplicables a la vista de detalles de subprocesos. Haga doble clic en el nombre de función en el panel de pila de llamadas de bloqueo para desplazarse a la vista de detalles de la función de esa función.
En el ejemplo puede ver que el subproceso pasa más tiempo que se bloqueen a la que se ejecutan en la primera parte de la ejecución y, a continuación, se bloquea durante mucho tiempo en un conjunto de varios identificadores. Como el último bloque causa está esperando a que otros subprocesos que se complete, contención de tiempo de compilación indica el uso de subprocesos que no sea óptima, haciendo que el subproceso está en un estado bloqueado más de en un estado de ejecución.
Busca hacia abajo el problema.
Como habrá observado, los rótulos de eje del gráfico son hipervínculos. Esto permite alternar entre vistas detalladas de los recursos y subprocesos, al establecer el contexto necesario para la vista cada vez. Esto puede ser útil en un método iterativo para encontrar y resolver el problema. Por ejemplo, puede examinar recursos R1 que bloquean el número de subprocesos. Puede ir a ver los detalles de recursos a una vista detallada del subproceso T1 y descubra que se ha bloqueado, no sólo en R1, pero a veces también en recursos R2. Puede profundizar en los detalles de R2 y observar todos los subprocesos bloqueados por R2. Siguiente puede hacer clic en la etiqueta del subproceso T2 que dibuja su atención para comprobar todos los recursos que bloquean T2, y así sucesivamente.
Contención de datos de generación de perfiles no obtendrá una respuesta explícita a la pregunta de la que mantiene un bloqueo en un momento dado. Pero, dado el uso razonable de objeto de sincronización entre subprocesos y el conocimiento del comportamiento de la aplicación, se puede identificar un propietario posible bloqueo (es decir, un subproceso que se realizó correctamente en la adquisición de bloqueo de sincronización) por los datos de detalles de recursos para obtener más información de subproceso de creación de tablas dinámicas y vuelve.
Por ejemplo, supongamos que en la vista de detalles de subprocesos que se ve un subproceso de T que se bloquea en el recurso R en tiempo de t.. Puede cambiar a la vista de detalles de recursos de R, haga clic en la etiqueta de R y ver todos los subprocesos bloqueados en R durante el período de duración de la aplicación. En tiempo de t. verá un número de ellos (incluyendo T) bloqueado en r. Un subproceso que no esté bloqueado en R en tiempo de t. es un marcador de posible bloqueo.
He indicado anteriormente que de línea total del gráfico es la proyección de todos los bloques de contención. La etiqueta total también es un hipervínculo, pero desde la vista de detalles de los recursos que le lleva a la contención ver (consulte de figura 7), que es un conjunto de árboles de contención de llamada por recurso. La ruta de acceso rápida del árbol de llamadas de recursos correspondiente se activa automáticamente. Esta vista muestra las estadísticas de tiempo de bloqueo para cada recurso y para cada nodo (función) y de contención en el árbol de llamadas de recursos. A diferencia de las otras vistas, éste agrega las pilas de contención en el árbol de llamadas de recursos, al igual que en otros modos de creación de perfiles y le proporciona las estadísticas de ejecución de la totalidad de la aplicación.
La figura 7 de la vista de conflicto con la ruta de acceso activa aplicada a la sección crítica (1)
En la vista de contención, puede volver a la vista de detalles de recursos de cualquier recurso mediante el menú contextual. Seleccione un recurso, con el botón secundario del mouse (ratón) y seleccione Mostrar detalles de conflicto de recursos. También existen otras acciones interesantes en el menú contextual. Como sugerencia general, explore los menús contextuales en las vistas del analizador, que pueden ser bastante útiles.
Haga clic en la etiqueta total de la vista de detalles de subprocesos para mostrar la vista de procesos, donde el subproceso está seleccionado (vea de figura 8). En esta vista que puede ver cuándo se inició el subproceso con respecto a la hora de inicio de aplicación, cuando se finaliza el tiempo que se ejecutó, cuántos contención experimentado, y el tiempo se ha bloqueado a través de todos los contención (en milisegundos y el porcentaje de tiempo de vida del subproceso).
La figura 8 de vista procesos
Una vez más, es posible volver a la vista de detalles de subprocesos de cualquier subproceso mediante el menú contextual, seleccione un subproceso de interés, con el botón secundario y seleccione Mostrar detalles de bloqueo de subprocesos.
Otro flujo de investigación posible sería mostrar la vista procesos directamente cuando se abre el archivo, los subprocesos de ordenar, haga clic en el título de una de las columnas disponibles (por ejemplo, subprocesos de ordenación por el número de contención), seleccione uno de los subprocesos y, a continuación, cambie al gráfico de detalles de la contención del subproceso en el menú contextual.
Corregir el problema y los resultados de la comparación
Cuando haya encontrado la causa raíz de la contención de bloqueo de la aplicación, puede comentar a la sección crítica mmlock y, a continuación, vuelva a ejecutar la generación de perfiles:
for (i = myid*PerProcessorChunk;
i < (myid+1)*PerProcessorChunk;
i++) {
// EnterCriticalSection(&mmlock);
for (j=0; j<SIZE; j++) {
for (k=0; k<SIZE; k++) {
C[i][j] += A[i][k]*B[k][j];
}
}
// LeaveCriticalSection(&mmlock);
}
Es de esperar el número de contención para reducir y generar perfiles de hecho de que el código modificado informes sólo una contención de bloqueo, tal como se muestra en de figura 9.
La figura 9 de vista de resumen de resultados de generación de perfiles de código fijo
También podemos comparar los resultados de rendimiento anterior y nuevo en Visual Studio. Para ello, seleccione ambos archivos en el Explorador de rendimiento (seleccionar un archivo, presione la tecla MAYÚS o Ctrl y, a continuación, seleccione otro), a continuación, haga clic en y seleccione Comparar informes de rendimiento.
Aparece un informe de comparación, como se muestra en de figura 10. En la aplicación de ejemplo, puede ver el número de contención de inclusión de la función MatMult reducida de 1,003 a 0.
La figura 10 del informe de comparación
Métodos de recopilación de datos alternativo
Si crea la sesión de rendimiento para muestreo o instrumentación de generación de perfiles, puede siempre convertirlo más adelante en el modo de concurrencia. Una forma de hacerlo de forma rápida es utilizar el menú de modo de generación de perfiles en el Explorador de rendimiento. Sólo tiene que seleccionar el modo en que desea que estén en, y es una buena idea ir.
También puede ir a través de la configuración de propiedades de la sesión. Seleccione la sesión en el Explorador de rendimiento, con el botón secundario para mostrar el menú contextual y seleccione Propiedades. La ficha general de las páginas de propiedades de permite que controlar el modo de sesión de generación de perfiles y otros parámetros de generación de perfiles.
Una vez que se establece el modo de generación de perfiles para la concurrencia (o de muestreo, en este caso), puede que cualquier inicio de la aplicación (ya está en la lista de destinos de si ha utilizado el Asistente de rendimiento, o puede agregarlo existe manualmente), o se pueden asociar a una aplicación que está en funcionamiento. Explorador de rendimiento le ofrece los controles para realizar estas tareas, como se muestra en de figura 11.
La figura 11 de controles de explorador de rendimiento de generación de perfiles
La interfaz de usuario de Visual Studio automatiza varios de los pasos necesarios para recopilar datos de generación de perfiles. Sin embargo, es posible recopilar los datos de generación de perfiles mediante el uso de herramientas de línea de comandos, que pueden ser útiles para la ejecución automatizada y las secuencias de comandos.
Para iniciar la aplicación en modo de generación de perfiles de contención, abra la línea de comandos de Visual Studio (que incluye todos los archivos binarios del generador de perfiles en la ruta de acceso, ya sea x 86 o x64 herramientas) y, a continuación, haga lo siguiente:
VSPerfCmd.exe /start:CONCURRENCY, RESOURCEONLY /output: <YourOutputFile>
/Launch VSPerfCmd.exe: < aplicación > /args: “ < Your Application argumentos > ”
Ejecutar el escenario
VSPerfCmd.exe / separar
- Este paso no es necesario si la aplicación termina, pero no se produce ningún daño, para que puede agregar a las secuencias de comandos.
/Shutdown VSPerfCmd.exe
Ahora puede abrir YourOutputFile.VSP en Visual Studio para el análisis.
Si dispone de una aplicación que ya se está ejecutando, puede adjuntar el generador de perfiles, siga estos pasos:
- VSPerfCmd.exe /start:CONCURRENCY, RESOURCEONLY /output: <YourOutputFile>
- VSPerfCmd.exe / adjuntar: < PID o nombre de proceso >
- Ejecutar el escenario
- VSPerfCmd.exe / separar
- /Shutdown VSPerfCmd.exe
Puede encontrar una explicación más detallada de las opciones de línea de comandos disponibles en msdn.microsoft.com/library/bb385768(VS.100) de.
Una gran variedad de vistas de Visual Studio le permite inspeccionar los datos recopilados de cerca. Algunas vistas proporcionan una imagen de la duración de la aplicación en su totalidad, mientras que otros se centran en contención específica, los de los más importantes utilice.
Al analizar los resultados de generación de perfiles, puede utilizar transiciones de una vista a otra a través de los hipervínculos, doble clic, o bien, los menús contextuales, o bien puede pasar directamente a cualquier vista disponible a través de una acción de colocar-hacia abajo de menú. La figura 12 describe brevemente cada una de las vistas.
La figura 12 de vistas de análisis
Ver | Descripción |
Resumen | Información de resumen se presenta para servir como punto de partida para la investigación. Se trata de la primera vista que aparece y se abre automáticamente después de una sesión de generación de perfiles está sobre y el archivo de resultados está listo. |
Llame al árbol | Un árbol de llamadas agregados de todas las pilas de contención. Aquí puede ver qué pilas fueron los responsables de la contención. |
Módulos | Una lista de módulos que contienen funciones, cada lugar a una contención. Cada módulo tiene una lista de funciones relevantes y el número de contención detectados. |
Llamador y destinatario | Una vista de tres paneles que presenta función F, todas las funciones que llaman a la F y funciones que se llaman a F (sólo llamadas produjeron contención, por supuesto). |
Funciones | Una lista de todas las funciones detectadas en ninguna pila de contención, con los datos asociados. |
Líneas | Las líneas de la función en el código fuente. |
Detalles de recursos | Obtener más información acerca de un recurso específico (por ejemplo, un bloqueo), que muestra todos los subprocesos bloqueados en él durante el período de duración de la aplicación. |
Detalles de subprocesos | Obtener más información acerca de un subproceso específico, que muestra todos los recursos (como, por ejemplo, bloqueos) en el subproceso se bloqueó en. |
Contención | Es similar a la vista de árbol de la llamada, pero los árboles están separados por el recurso de contención de llamada aquí. En otras palabras, esta vista presenta un conjunto de árboles de llamadas, cada contenedor pilas que se han bloqueado en un recurso específico. |
Marcas | Lista de marcas registradas de forma automática y manualmente, donde cada Mark está asociado con su Mark de hora y los valores de contadores de Windows. |
Procesos | Una lista de procesos inspeccionados, donde cada proceso tiene una lista de los subprocesos, y cada subproceso tiene los atributos de contención que ha excedido el número y el tiempo bloqueado resumida. |
Detalles de función | Detalles sobre una función específica, incluidas las funciones las llamadas y los datos recopilados. |
Direcciones IP | Una lista de punteros de la instrucción donde ha ocurrido con la contención (bueno, una lista de funciones como EnterCriticalSection, WaitForSingleObject y así sucesivamente, ya que es donde realmente sucede contención). |
La contención de recursos de nueva generación de perfiles de las características de Visual Studio le ayudarán a descubrir problemas de rendimiento mediante la sincronización de subprocesos en el código y que permiten mejorar el tiempo de ejecución de la aplicación mediante la modificación, reduce o se elimina de la sincronización innecesaria.
Maxim Goldin es ingeniero de diseño de software senior de Microsoft. Ha trabajado en el equipo de ingeniería de Visual Studio desde el año 2003. Puede ponerse en mgoldin@microsoft.com de y blogs en blogs.msdn.com/b/mgoldin de.
Para obtener información adicional acerca de flujos de investigación de rendimiento ver mi blog adjunto en blogs.msdn.com/b/mgoldin/archive/2010/04/22/resource-contention-concurrency-profiling-in-visual-studio-2010-performance-investigation-flows.aspx de.
Gracias a los siguientes expertos técnicos por su ayuda en la revisión de este artículo: Steve Carroll, Anna Galaeva, Daryush Laqab, Marc Popkin-Paine, Chris Schmich y Colin Thomsen