Domanda

Sono in esecuzione nel seguente problema, mentre profiling una domanda ai sensi VC6. Quando ho Profilo La domanda, il profiler indica che un semplice metodo getter simile al seguente viene chiamato molte centinaia di migliaia di volte:

int SomeClass::getId() const
{
   return m_iId;
};

Il problema è che questo metodo non viene chiamato in tutto l'applicazione di test . Quando cambio il codice al seguente:

int SomeClass::getId() const
{
   std::cout << "Is this method REALLY being called?" << std::endl;
   return m_iId;
};

Il profiler non comprende getId nella lista delle funzioni richiamate. Commentare la cout e sono di nuovo diritto di dove ho iniziato, 130 + mila chiamate! Giusto per essere sicuri che non è stato un po 'di dati profiler cache o danneggiato tabella di funzione di ricerca, che sto facendo un ambiente pulito e ricostruire tra una prova. Ancora gli stessi risultati!

Tutte le idee?

È stato utile?

Soluzione

Direi che quello che sta succedendo è che il compilatore e / o il linker è 'coalescenza' proprio questa semplice funzione di una o più altre funzioni che sono identici (il codice generato per return m_iId è probabile esattamente lo stesso di molti altri getter che capita di tornare un membro che è allo stesso offset).

essenzialmente, un gruppo di diverse funzioni che capita di avere implementazioni codice macchina identici sono tutti risolti allo stesso indirizzo, confondendo la profilatore.

Si può essere in grado di fermare questo accada (se questo è il problema) spegnendo le ottimizzazioni.

Altri suggerimenti

Presumo che stiamo profilatura perché si vuole scoprire se ci sono modi per rendere il programma meno tempo, giusto? Tu non sei solo profiling perché ti piace vedere i numeri.

C'è un semplice, vecchio stile, provato e vero modo per trovare i problemi di prestazioni. Mentre il programma è in esecuzione, basta premere il tasto "pausa" e guardare lo stack di chiamate. Farlo più volte, come da 5 a 20 volte. Più grande è un problema è, i campioni meno è necessario trovarlo.

Alcuni chiedono se questo non è fondamentalmente ciò che fanno profiler, e la risposta è solo pochissimi. La maggior parte dei profiler cadono per uno o miti più comuni , con il risultato che il vostro aumento di velocità è limitata perché non trovano tutti i problemi:

  • Alcuni programmi sono spese inutili di tempo in "punti caldi". Quando questo è il caso, si vedrà che il codice alla "fine" della pila (dove il contatore di programma è) sta facendo un lavoro inutile.

  • Alcuni programmi fare di più I / O del necessario. Se è così, si vedrà che essi sono in procinto di farlo I / O.

  • programmi di grandi dimensioni sono spesso lento perché i loro alberi di chiamata sono inutilmente folta, e hanno bisogno di potatura. Se è così, si vedrà il chiamate di funzione a metà dello stack inutili.

Qualsiasi codice che vedi su una certa percentuale di pile sarà, se rimosso, fermo restando che la percentuale di tempo di esecuzione (più o meno). Non si può andare male. Ecco un esempio , su più iterazioni, di salvare oltre il 97 %.

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