Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Общие вопросы разработки программ _ среднее время доступа к жесткому диску

Автор: Тёмный Эльф 16.12.2007 3:19

Как подсчитать среднее время доступа к информации на жестком диске по записи?
Вроде бы оно равняется задержке между получением команды и моментом считывания первого бита данных.
Буду рада любым разъяснениям, ссылкам.

Автор: andriano 16.12.2007 3:37

Среднее время, очевидно, величина статистическая.
Измеряется, например, чтением 1000 различных секторов, случайно разбросанных по поверхности диска.
Впрочем, фирмы-производители применяют другие более сложные методики. Обычно при их использовании время получается несколько меньше, чем при выборе номеров секторов датчиком псвдослучайных чисел.

Автор: Тёмный Эльф 16.12.2007 16:06

Можно пожалуйста поподробнее про чтение секторов? Например, примеры реализации на Си

Автор: andriano 16.12.2007 17:17

На Си нету. Есть на Паскале (ТМТ).
Увы, в 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;