2011-02-07 3 views
0

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

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

Так что процедура будет что-то вроде этого:

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

Какая операционная система –

+0

Операционная система не важна. Это может быть Windows или Linux. – rigon

+0

См. Http://stackoverflow.com/questions/538609/high-resolution-timer-with-c-and-linux –

ответ

5

Наиболее полезная функциональность является «RDTSC» инструкция (Прочтено Time Stamp Counter), который увеличивается каждый раз, когда приращение внутренней частоты процессора. Для процессора 3 ГГц он увеличивается на 3 миллиарда раз в секунду. Он возвращает 64-битное целое число без знака, содержащее количество тактовых циклов с момента включения процессора.

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

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

алгоритм 0,1 нам наиболее точное значение, которое можно использовать без для настройки на служебные данные для чтения.

+0

Как это сделать? – rigon

+0

Поиск rdtsc среди встроенных, нестандартных функций компилятора. В C для x86-32 он может быть закодирован как отдельная функция unsigned __int64 name (void) с _asm {rdtsc} в качестве ее единственного содержимого. rdtsc поместит результат в edx: eax, которые (всегда?) регистры, используемые для возврата __int64s из функций. В функциональной форме вам нужно измерять накладные расходы, хотя это будет значительным. –

3

В C, функция, которая будет наиболее полезным является часами() в time.h.

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

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/

+1

Примечание: 'clock_t' может быть целым. Если это так, 'elapsed_time' будет иметь разрешение 1 секунду и, вероятно, всегда будет' 0' для хороших секторов. Это может быть даже 0 для плохих секторов, если вызов завершается менее чем за секунду, что, безусловно, представляется возможным, если сектор не слишком запутан. –

+0

@Michael Burr: Я абсолютно уверен, что 'clock_t' всегда будет целым числом, половина часов не имеет большого смысла. В любом случае, не нужно выбрасывать оставшуюся часть. – Hasturkun

+0

Это правильно. Я отредактировал свой ответ, чтобы изменить elapsed_time на float и вычислить его как float. –

Смежные вопросы