Visual Studio - tiempo de ejecución de impacto de los condicionales y los discapacitados puntos de interrupción

StackOverflow https://stackoverflow.com/questions/1589510

Pregunta

Después de pasar un poco de tiempo preguntándome por qué mi aplicación se ejecuta un determinado escenario muy lentamente con el depurador, descubrí que esto era debido a tener un punto de interrupción condicional (cuya condición era que nunca se cumplen).Esto parece razonable, ya que el CPU sería una señal de que el punto de ruptura y VS, será necesario evaluar la condición antes de permitir que continúe la ejecución.Estas transiciones deben ser costoso.

Supongo que un punto de interrupción en una ruta de código que no se ejecuta no tiene tiempo de ejecución de impacto.

Así que mi pregunta es doble:

  1. Hay recursos que se pueden cuantificar los costos asociados con los puntos de interrupción condicionales, y si es así ¿hay algo que uno puede hacer para reducir su tiempo de ejecución de la evaluación costo?
  2. Es allí cualquier costo asociado con un "discapacitado" punto de ruptura?Por deshabilitado me refiero a que VS se muestra el marcador de punto de interrupción en la cuneta con un círculo.

Por supuesto, si hay algo que he mencionado anteriormente no tiene sentido, a continuación, por favor, me apunte en la dirección correcta.

¿Fue útil?

Solución

Es difícil cuantificar el costo de un punto de interrupción condicional. La expresión en un punto de interrupción condicional se evalúa utilizando exactamente la misma semántica como si la hubiera escrito en el reloj o la ventana inmediata. Las expresiones de esta naturaleza no se ejecutan en el programa del cliente, sino que se manejan por el evaluador de expresión específico del lenguaje. No es realmente posible perfilar este tipo de evaluaciones de manera significativa.

Sin embargo, puedo enumerar algunas cosas que se sabe que son más lentas en una ventana de depuración evalúa

  • Llamadas a la función: son lo más lento que puede hacer porque la llamada de función requiere que se reinicie el proceso de depuración para que la evaluación de funciones pueda ocurrir en el proceso
  • Comparación de cuerdas: debajo del capó, estos vuelven a las evals de funciones

En cuanto a los puntos de interrupción discapacitados, no, no afectan la ejecución de la aplicación.

Otros consejos

Una cosa a tener en cuenta (que aprendí de la manera difícil) es asegurarse de poner == al comparar una variable con un valor y no al único =

El editor de punto de interrupción no le advierte, pero cuando se evalúa el punto de interrupción, ¡la variable está alterada! ¡Me tomó un tiempo depurar mi código con ese!

Además, si realmente necesito el punto de interrupción condicional para el código Bebug; Agrego la condición al código, luego agrego algo como string stop = "aquí"; Y ponga un punto de interrupción normal allí: encuentro que el código se ejecuta más rápido entonces.

Leí en algún lugar que hay soporte de hardware para estos puntos de interrupción, de modo que usar menos de X puntos de interrupción condicionales de cierto tipo es esencialmente gratuito, pero por encima de eso, necesita usar más software. (OTOH, eso fue para aplicaciones nativas, no estoy seguro de estas cosas de JIT novedosa).

Los puntos de interrupción de discapacitados deberían afectar las cosas, solo ocurren en el IDE.

También he notado que en los puntos de interrupción condicionales son caros y llegó a la misma conclusión que tú.No me puedo imaginar ninguna razón para que un discapacitado punto de interrupción podría causar ningún tipo de ralentización, ya que me sería de esperar que sea un editor única cosa, un acceso directo para activar un punto de interrupción en caso de ser necesario.

Lo que yo hago cuando estoy en una situación como la suya es hacer una aserción macro.(usted puede utilizar el afirmar macro que proporciona visual studio, pero no me gusta).Tiene su macro comprobar la condición que desea y, a continuación, llamar a DebugBreak si se produce un error.En el desprendimiento, o no-compilación comprobada de su aplicación, han afirmar evaluar a nada, por lo que su código no está afectado.

Una simple aserción de la macro puede verse como:

#ifdef _DEBUG
#define assert(x)\
do{\
  if(!(x)){DebugBreak();}\
}while(0)
#else
#define assert(x)
#endif

y lo llaman como:

assert(pValue != NULL && "A bad parameter was passed to the function");

Se puede poner más de código en el error antes de DebugBreak (como la impresión de la condición de que no pudo con #x, y/o la línea/número de archivo con ____ARCHIVO____ y ____LÍNEA____ así que usted puede hacer doble clic en el mensaje).Usted puede escribir mensajes en el registro de depuración con OutputDebugString e incluso comprobar para ver si está conectado un depurador con IsDebuggerPresent para adaptar su valer incluso más.También me gusta usar el && de la cadena de formato para dar un poco más de información sobre el particular, afirman.

Hay un par de cosas a tener cuidado cuando se utiliza la aserción.En primer lugar, no poner el código que se DEBE ejecutar en la macro, ya que será despojado en la no generación de depuración.Por las mismas razones, no poner en el código que tiene efectos secundarios.También, usted no quiere llamar a DebugBreak() cuando un depurador no está conectado porque básicamente se produce una excepción, que si no se descubren, se termina la aplicación.

  1. Intente poner el punto de interrupción en su código para probar el rendimiento. P.EJ

    Stopwatch st = new Stopwatch();
    st.Start();
    if(my condition)
    {
      st.Stop();
      Debugger.Break();
    }
    

    No, no exactamente lo mismo pero lo suficientemente cerca.

  2. No: un punto de ruptura para discapacitados no está presente en el programa de ejecución. Se acaba de almacenar en los metadatos VS para su conveniencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top