Помощь - Поиск - Пользователи - Календарь
Полная версия: среднее время доступа к жесткому диску
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Общие вопросы разработки программ
Тёмный Эльф
Как подсчитать среднее время доступа к информации на жестком диске по записи?
Вроде бы оно равняется задержке между получением команды и моментом считывания первого бита данных.
Буду рада любым разъяснениям, ссылкам.
andriano
Среднее время, очевидно, величина статистическая.
Измеряется, например, чтением 1000 различных секторов, случайно разбросанных по поверхности диска.
Впрочем, фирмы-производители применяют другие более сложные методики. Обычно при их использовании время получается несколько меньше, чем при выборе номеров секторов датчиком псвдослучайных чисел.
Тёмный Эльф
Можно пожалуйста поподробнее про чтение секторов? Например, примеры реализации на Си
andriano
На Си нету. Есть на Паскале (ТМТ).
Увы, в 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;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.