Una definizione di "hot spot" è una regione di codice in cui il contatore del programma trascorre una buona parte del suo tempo. Un termine correlato è un "collo di bottiglia" che, mal definito, generalmente si riferisce a un codice localizzato su una funzione, una routine o un metodo, che causa una frazione di tempo più lunga del necessario.
Entrambi questi termini sono molto fuorvianti, perché c'è un'enorme ipotesi non scritta. L'assunto è che non ci sono opportunità di accelerare un programma che non sia un hotspot o un collo di bottiglia. Le opportunità di aumento della velocità possono essere più diffuse, e se non vengono trovate e riparate, diventano il limitatore delle prestazioni.
Lasciatemi fare un esempio. Recentemente, quando ho lavorato su un programma C++ di circa 300 linee, ho preso dieci stackshots, perché volevo vedere come potevo accelerarlo. Quattro di questi stackshots si presentava così:
CTypedPtrArray<CPtrArray,COperation *>::operator[]() line 1555 + 23 bytes
TcProcess() line 246 + 14 bytes ---> COperation* pOp = oplist[i];
CMhAck::Handler() line 165
doit() line 297 + 12 bytes
main() line 318
CTypedPtrArray<CPtrArray,CJob *>::operator[]() line 1555 + 23 bytes
SchProcess() line 212 + 14 bytes ---> pJob = joblist[i];
COpAck::Handler() line 145
doit() line 297 + 12 bytes
main() line 318
CTypedPtrArray<CPtrArray,CTask *>::operator[]() line 1555 + 23 bytes
TcProcess() line 249 + 18 bytes ---> pTask = pOp->tasks[pOp->iCurTask];
CMhAck::Handler() line 165
doit() line 297 + 12 bytes
main() line 318
CTypedPtrArray<CPtrArray,CTask *>::operator[]() line 1555 + 23 bytes
COperation::~COperation() line 57 + 15 bytes ---> CTask* p = tasks[i];
COperation::`scalar deleting destructor'() + 37 bytes
TcProcess() line 259 + 28 bytes
CTskAck::Handler() line 193
doit() line 297 + 12 bytes
main() line 318
Il programma ha preso 20 secondi complessiva. Ciò che questi campioni di stack mi dicono è circa il 40% di quel tempo, o 8 secondi, viene speso nell'operatore di indicizzazione sulla classe dell'array. Questo mi dice che potrei ridurre il tempo di esecuzione da 20 secondi a 12 secondi, dare o prendere, se potessi fare l'indicizzazione più direttamente, non attraverso una chiamata di funzione. L'accelerazione sarebbe 20/12 = 1.67, o circa un aumento del 67%. (Avviso: Non me ne frega un bel niente "esatta" quando si tratta di tempi Quello che volevo fare era trovare il problema..)
Ora si potrebbe facilmente essere in disaccordo con tale metodo di risolvere il problema , ma puoi vedere come ho rilevato quale problema era, giusto?
OK, quindi dov'è "l'hotspot" e dov'è il "collo di bottiglia"? Chiaramente c'è un hotspot nella funzione di indicizzazione dell'operatore, ma è dove si trova il problema? (In realtà non è nemmeno così, perché sono tre diverse funzioni.) Significa che dovrei provare a rendere più veloce quella routine? Non ne sono nemmeno proprietario!
C'è un collo di bottiglia sotto forma di una "routine lenta"? No! Non c'è una routine particolare che sia lenta o un "cattivo algoritmo".
Quello che ho fatto è stato fare un descrizione di ciò che stava facendo ("E 'indicizzazione in alcune routine.") Dove questa descrizione si applica una grande frazione del tempo.
Il termine migliore che riesco a trovare per queste cose è il "time drain", perché sta trascorrendo una grande quantità di tempo a fare cose che non lo fanno in realtà.
More about terminology and popular misconceptions.
Una domanda per i programmatori pila? – Wivani