Измерьте точное время (количество циклов) набора инструкций - PullRequest
2 голосов
/ 08 февраля 2011

У меня на диске несколько секторов с плохим чтением.Я мог бы измерить время чтения, требуемое каждым сектором, а затем сравнить время хороших секторов и плохих секторов.

Я мог бы использовать таймер процессора для выполнения измерений.Как мне написать программу на C / Assembly, которая измеряет точное время чтения каждого сектора?

Таким образом, процедура будет выглядеть примерно так:

Start the timer
Read the disk sector
Stop the timer
Read the time measured by the timer

Ответы [ 2 ]

5 голосов
/ 09 февраля 2011

Наиболее полезная функция - это команда «rdtsc» (счетчик меток времени ReaD), которая увеличивается каждый раз, когда внутренние тактовые частоты процессора увеличиваются. Для процессора с частотой 3 ГГц он увеличивается на 3 миллиарда раз в секунду. Возвращает 64-разрядное целое число без знака, содержащее количество тактов с момента включения процессора.

Очевидно, что разница между двумя считываниями - это количество истекших тактовых циклов, использованных для выполнения промежуточной кодовой последовательности. Для машины с частотой 3 ГГц вы можете использовать любой из следующих алгоритмов для преобразования в доли секунды:

(time_difference + 150) / 300 дает округленное прошедшее время за 0,1 мкс (десятые доли микросекунд) (time_difference + 1500) / 3000 дает округленное прошедшее время в нас (микросекунды) (time_difference + 1500000/3000000 дает округленное прошедшее время в мс (миллисекундах)

Алгоритм 0.1 us является наиболее точным значением, которое вы можете использовать без необходимости корректировать накладные расходы на считывание.

3 голосов
/ 08 февраля 2011

В C наиболее полезной является функция clock () во времени. Ч.

Чтобы рассчитать время, поместите вызовы clock () вокруг него, например:

clock_t start, end;
float elapsed_time;
start = clock();
read_disk_sector();
end = clock();
elapsed_time = (float)(end - start) / (float)CLOCKS_PER_SEC;
printf("Elapsed time: %f seconds\n", elapsed_time);

Этот код выводит количество секунд, которое потребовался вызову функции read_disk_sector ().

Подробнее о функции часов вы можете прочитать здесь: http://www.cplusplus.com/reference/clibrary/ctime/clock/

...