Одним из определений «горячей точки» является область кода, в которой счетчик программы тратит значительную часть своего времени.
Связанным термином является «узкое место», которое, хотя и является плохо определенным, обычно относится к коду, локализованному для функции, подпрограммы или метода, что приводит к потере большей доли времени, чем необходимо.
Оба эти термина очень вводят в заблуждение, потому что существует огромное неписанное предположение.
Предполагается, что нет возможности ускорить программу, которая не является горячей точкой или узким местом.
Возможности ускорения могут быть более рассеянными, и если они не найдены и не исправлены, они ограничивают производительность.
Позвольте мне привести пример.
Недавно, работая над программой на C ++ длиной около 300 строк, я взял десять стеков , потому что хотел посмотреть, как я могу ускорить его.
Четыре из этих стеков выглядело так:
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
Программа заняла всего 20 секунд.
Эти образцы стека говорят мне, что примерно 40% этого времени или 8 секунд тратится в операторе индексирования в классе массива.
Это говорит мне, что я мог бы сократить время выполнения с 20 до 12 секунд, отдавать или брать, если бы я мог выполнять индексацию более напрямую, а не с помощью вызова функции.
Ускорение составило бы 20/12 = 1,67, или примерно на 67%.
(Обратите внимание: я не кричу о «точном» времени, когда дело доходит до времени. Что я хотел сделать, это найти проблему .)
Теперь можно легко не согласиться с этим методом решения проблемы, но вы можете видеть, как я обнаружил в чем проблема , верно?
Хорошо, так где же «горячая точка» и «узкое место»?
Очевидно, что в функции оператора индексирования есть горячая точка, но в этом ли проблема?
(На самом деле это даже не так, потому что это три разные функции.)
Означает ли это, что я должен попытаться сделать эту процедуру быстрее?
Я даже не владею им!
Есть ли узкое место в виде некой "медленной рутины"?
Нет!
Там нет какой-то медленной процедуры или «плохого алгоритма».
Я сделал описание того, что он делал («Он индексирует в определенных подпрограммах»), где это описание применяет большую часть времени.
Лучший термин, который я могу придумать для этих вещей, - «утечка времени», потому что он тратит большую часть времени на то, что не нужно делать на самом деле .
Подробнее о терминологии и распространенных заблуждениях.