Wremja-(int)(Finish-Start-SpeedCPU.Over); //Выводим результаты на экран:
sprintf(S." Накладные затраты \Ud тактов \п Доступ по индексам \Ug мкс \п Доступ через указатель \Ug мкс". SpeedCPU.Over. Wremja2/SpeedCPU.Speed. Wremja/SpeedCPU.Speed); MessageBox(hWnd.S.M Измерение командой rdtsc".0);
}
break;
}
return DefWindowProc(UkOkn.message.wParam.lParam): }
Результаты измерения командой rdtsc показаны нц рис. 4.1. В заголовке окна показана тактовая частота процессора, выведенная функцией CalibrateO. При повторном запуске приложения результаты отличаются во втором знаке после десятичной точки. При измерении с фиксацией времени функцией timeGetTime() время суммирования составило менее 1,7 мкс. Таким образом, при многократном суммировании наличие кэш-памяти занизило реальное время счета более чем вдвое.
При выполнении указанной программы на ЭВМ с процессором Pentium, имеющим тактовую частоту 133 МГц, получается, что для суммирования 400 элементов массива требуется около 90 мкс, причем по результатам измерения при помощи счетчика TSC суммирование выполнялось приблизительно на 10 % дольше. То есть в современном процессоре эффект применения кэш-памяти значительно выше.
Измерение временных интервалов
Рис. 4.1. Время суммирования Используя данный фрагмент программы, можно получить полезные рекомендации. На рис. 4.1 видно, что доступ к элементам массива по указателю существенно сокращает время суммирования. Выигрыш во времени обусловлен тем, что при выполнении оператора Sum += Test[i. j] для вычисления адреса каждого следующего элемента используется длинная операция умножения индекса i на размер строки матрицы Test. А в операторе Sum += *р++ адрес очередного элемента получается путем прибавления его размера к адресу предыдущего. Проверка показала, что на Pentium-133 это сокращает время вычислений более чем вдвое. У современного процессора и команда умножения реализована более эффективно, поэтому разрыв между затратами на умножение индекса и наращивание указателя меньше.