Domanda

Dopo aver trascorso un po 'di tempo chiedendo perché la mia applicazione è in esecuzione un particolare scenario molto lentamente con il debugger, ho scoperto che questo era a causa di avere un punto di interruzione condizionale (la cui condizione non è mai stati raggiunti). Questo sembra ragionevole, come CPU segnalerebbe il punto di interruzione e VS dovrebbe valutare la condizione prima di consentire l'esecuzione di continuare. Queste transizioni devono essere costosi.

I supporre che un punto di interruzione in un percorso di codice che non viene eseguito non ha alcun impatto runtime.

Quindi la mia domanda è duplice:

  1. Ci sono risorse che possono quantificare il costo associato con punti di interruzione condizionali, e se è così c'è qualche cosa si può fare per ridurre il loro costo di valutazione di runtime?
  2. C'è un costo associato a un punto di interruzione 'disabile'? Con disabile voglio dire che VS visualizza l'indicatore di punto di interruzione nella grondaia con un cerchio vuoto.

Naturalmente, se tutto quello che ho citato sopra non ha senso, quindi per favore mi punto nella giusta direzione.

È stato utile?

Soluzione

E 'difficile quantificare il costo di un punto di interruzione condizionale. L'espressione in un punto di interruzione condizionale viene valutata utilizzando la stessa semantica esatta, come se si fosse digitato in l'orologio o la finestra immediata. Espressioni di questo tipo non sono effettivamente eseguite nel programma client, ma invece gestite dalla specifica analizzatore di espressioni lingua. Non è davvero possibile al profilo di questi tipi di valutazioni in modo significativo.

Comunque posso elencare alcune cose che sono noti per essere più lento in una finestra eval debug

  • Funzione chiamate: Sono la cosa più lento si può fare perché la chiamata di funzione richiede il processo di debug di essere riavviato in modo che l'eval func può verificarsi nel processo
  • Confronto tra stringhe: Sotto il cofano questi risalgono al evals func

Per quanto riguarda i punti di interruzione disabili, no non influenzano il funzionamento dell'applicazione.

Altri suggerimenti

Una cosa da guardare fuori per (che ho imparato a mie spese) è quello di assicurarsi di mettere == quando si confrontano una variabile per un valore e non il singolo =

L'editor punto di interruzione non avvisa voi, ma quando il punto di interruzione viene valutata, la variabile è alterato! Mi ha portato un po 'per eseguire il debug il mio codice con quello!

Inoltre, se ho davvero bisogno il punto di interruzione condizionale per bebug codice; Aggiungo la condizione per il codice, quindi aggiungere qualcosa come fermata stringa = "qui"; e mettere un punto di interruzione normale lì - trovo il codice viene eseguito più veloce

.

Ho letto somwhere che non v'è il supporto hardware per questi punti di interruzione, in modo che l'utilizzo di meno di x punti di interruzione condizionali di un certo tipo è essenzialmente libero, ma soprattutto che, ha bisogno di utilizzare più software. (OTOH, che è stato per le applicazioni native, non è sicuro di queste cose JIT diavolerie.)

punti di interruzione disabili dovrebbero prendere influenzare le cose a tutti, hanno appena occopy alcune risorse di memoria e di GUI in IDE.

Inoltre ho notato che i punti di interruzione condizionali sono costosi ed è giunta alla stessa conclusione, come si. Non riesco a immaginare alcun motivo che un punto di interruzione disabilitato causerebbe alcun rallentamento da quando mi aspetto che sia un editor sola cosa, una scorciatoia per accendere un punto di interruzione se ne avete bisogno.

Quello che faccio quando mi trovo in una situazione come la tua è fare una macro assert. (È possibile utilizzare la assert macro che Visual Studio fornisce, ma io non vi piace). Avere la macro verifica la condizione che si desidera e quindi chiamare DebugBreak se non riesce. Nel realease, o costruire non controllato della vostra applicazione, hanno affermare valutare a nulla, in modo che il codice non è influenzato.

Una semplice macro assert può apparire come:

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

e chiamare le cose come:

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

È possibile inserire più codice nel fallimento prima DebugBreak (come stampando la condizione che non è riuscita con #x, e / o il numero di riga / file con ____FILE____ e ____LINE____ in modo da poter fare doppio clic sul messaggio). È possibile scrivere messaggi al registro di debug con OutputDebugString e anche controllare per vedere se un debugger è attaccato con IsDebuggerPresent per adattare i vostri affermare ancora di più. Mi piace anche di utilizzare il formato di stringa && per dare un po 'più informazioni sul particolare asserzione.

Ci sono alcune cose da stare attenti quando si usano assert. In primo luogo, non mettere alcun codice che deve essere eseguito nella macro, dal momento che sarà messo a nudo in una build non di debug. Per le stesse ragioni, non mettere nel codice che ha effetti collaterali. Inoltre, non si vuole chiamare DebugBreak () quando un debugger non è attaccato perché genera essenzialmente un'eccezione, che, se non catturato, terminerà l'applicazione.

  1. Prova a mettere il punto di interruzione nella vostra codice per verificare le prestazioni. Per es.

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

    No, non è esattamente la stessa cosa, ma abbastanza vicino.

  2. No - un punto di interruzione non è disabile presente nel programma in esecuzione. E 'solo memorizzato nei metadati VS per la vostra convenienza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top