Якщо година виконання деякої крапки програми не постійно, а варіюється в тихнув або інших межах (наприклад, залежно від роду оброблюваних даних), те трактування результатів профілювання стає неоднозначної, а сам результат — ненадійним. Для більше достовірного аналізу потрібно: а) визначити чи дійсно в програмі присутні подібні "плаваючі" крапки й, якщо так, ті: б) визначити година їхнього виконання в кращому, гіршому й середньому випадках.
Далеко не всі профіліровщики мають здатність визначати питомий година виконання машинних команд (інша назва розтактовка). На щастя, профіліровщик VTune це вміє! Звернемося до сгенерованого їм протоколу динамічного аналізу. Бути може, він допоможе нам дозволити загадку "неповороткості" завантаження покажчика pswd?
Лістинг 1.4. Питомий година виконання машинних команд усередині профилируемого фрагмента програми
Line
| Instructions
| Dyn-Retirement
| Cycles
|
107 pswd[p] = '!';
|
| mov edx, DWORD PTR [ebp+0ch]
|
|
|
107;
| завантажити в регістр EDX покажчик pswd
|
| add edx,DWORD PTR [ ebp-4]
|
|
|
107;
| ^ скласти регістр EDX зі змінної p
|
| mov BYTE PTR [edx], 021h
|
|
|
107;
| записати в *(pswd+p) значення '!'
|
109 y = y | y << 8;
|
| mov eax,DWORD PTR [ ebp-28]
|
|
|
109;
| завантажити в регістр EAX змінну y
|
| shl eax, 08h
|
|
|
109;
| зрушити EAX на 8 позицій уліво
|
| mov ecx, DWORD PTR [ ebp-28]
| (0,7.3,80)
|
|
109;
| завантажити в регістр ECX змінну y
|
| or ecx, eax
|
|
|
109;
| ECX = ECX | EAX (tmp = y | y)
|
| mov DWORD PTR [ ebp-28], ecx
|
|
|
109;
| записати отриманий результат в y
|
110 x -= k;
|
| mov edx, DWORD PTR [ ebp-24]
|
|
|
110;
| завантажити в регістр EDX змінну x
|
| sub edx, DWORD PTR [ ebp-36]
|
|
|
110;
| відняти з регістра EDX змінну k
|
| mov DWORD PTR [ ebp-24], edx
|
|
|
110;
| записати отриманий результат в x
|
Ну, від знову, — всі команди, як команди, а завантаження покажчика pswd відбувається цілих тринадцять тактів, у тої година як інші вільно укладаються в один-два тактів, а деякі й зовсім займають нулів, маючи змогу завершитися одночасно з попередніми інструкціями.
За винятком команди, що завантажує вміст змінної y у регістр ECX, година виконання всіх інших команд строго постійно й не міняється година від години. Наша ж "підопічна" залежно від ще не з'ясованих обставин, може виконуватися навіть вісімдесят тактів, що на годину робить її самою "гарячою" крапкою даного фрагмента програми. Вісімдесят тактів — це взагалі повне свавілля! І пускай средній годину її виконання становить усього лише сім тактів, а мінімальне — і зовсім нуль, мі не заспокоїмося поки не з'ясуємо: на що й при яких саме обставинах іде така кількість тактів?