Как подсчитать среднее время доступа к информации на жестком диске по записи? Вроде бы оно равняется задержке между получением команды и моментом считывания первого бита данных. Буду рада любым разъяснениям, ссылкам.
Среднее время, очевидно, величина статистическая. Измеряется, например, чтением 1000 различных секторов, случайно разбросанных по поверхности диска. Впрочем, фирмы-производители применяют другие более сложные методики. Обычно при их использовании время получается несколько меньше, чем при выборе номеров секторов датчиком псвдослучайных чисел.
На Си нету. Есть на Паскале (ТМТ). Увы, в TMT не додеаны арифметические операции с int64, поэтому кое-что написано с учетом этой специфики. Ограничение - объем диска не больше терабайта. SeekSize - размер либо всего диска, либо той его части, в которой следует вычислять время доступа. NumSeek - количество читаемых секторов. Рекомендуется не менее 1000 (но и время измерения при этом будет 15-20 сек).
var handle : thandle; // хэндл устройства // ...
function GetSeekTime(SeekSize : extended) : extended; // вычисление времени поиска var e0,e1 : extended; // измерение времени buf : array[0..1023]of byte; // буфер чтения SecSize : dword; // количество секторов i : longint; j,n : dword; point1,point2 : array[0..1]of dword; // позиция в файле begin e0 := GetTimer_Q; SecSize := trunc(SeekSize/512); for i := 0 to NumSeek-1 do begin n := random(SecSize); point1[0] := n shl 9; point1[1] := n shr 23; point2 := point1; point1[0] := SetFilePointer (handle, point1[0], @point1[1], FILE_BEGIN); if (point1[0] <> point2[0]) or (point1[1] <> point2[1]) then deb2file('Seek ERROR! ',trunc(SeekSize/1024/1024)); ReadFile(handle, buf, 512, j, nil); if j <> 512 then deb2file('Read ERROR! ',trunc(SeekSize/1024/1024)); end; e1 := GetTimer_Q; GetSeekTime := (e1-e0)/NumSeek; end;