Если время выполнения некоторой точки программы не постоянно, а варьируется в тех или иных пределах (например, в зависимости от рода обрабатываемых данных), то трактовка результатов профилировки становится неоднозначной, а сам результат – ненадежным. Для более достоверного анализа требуется: а) действительно ли в программе присутствуют подобные "плавающие" точки и если да, то: б) определить время их исполнения в лучшем, худшем и среднем случаях.
Очень немногие профилировщики могут похвастаться способностью засекать удельное время выполнения машинных команд (еще называемое растактовкой). К счастью, VTune это умеет! Обратимся к сгенерированному им протоколу динамического анализа. Быть может, он поможет нам разрешить загадку "неповоротливости" загрузки указателя pswd?
Line Instructions Dyn-Retirement Cycles
107 pswd[p] = '!';
107 mov edx, DWORD PTR [ebp+0ch] 13 ************
107 ; ^ загрузить в регистр EDX указатель pswd
107 add edx, DWORD PTR [ebp-4] 2 **
107 ; ^ сложить регистр EDX с переменной p
107 mov BYTE PTR [edx], 021h 3 ***
107 ; ^ записать в *(pswd+p) значение '!'
109 y = y | y << 8;
109 mov eax, DWORD PTR [ebp-28] 2 **
109 ; ^ загрузить в регистр EAX переменную y
109 shl eax, 08h 1 *
109 ; ^ сдвинуть EAX на 8 позиций влево
109 mov ecx, DWORD PTR [ebp-28] (0,7.3,80)
109 ; ^ загрузить в регистр ECX переменную y *******
109 or ecx, eax 1 *
109 ; ^ ECX = ECX | EAX (tmp = y | y)
109 mov DWORD PTR [ebp-28], ecx 1 *
109 ; ^ записать полученный результат в y
110 x -= k;
110 mov edx, DWORD PTR [ebp-24] 0
110 ; ^ загрузить в регистр EDX переменную x