Процедура AssignCRT

Связывает текстовую файловую переменную F с экраном с помощью непосредственного обращения к видеопамяти (т.е. к памяти, используемой адаптером для создания изображения на экране). В результате вывод в такой текстовый файл осуществляется значительно (в 3...5 раз) быстрее, чем если бы этот файл был связан с экраном стандартной процедурой Assign. Заголовок процедуры:

Procedure AssignCRT(F: Text);

В следующей программе измеряется скорость вывода на экран с помощью стандартной файловой процедуры и с помощью непосредственного обращения к видеопамяти. Вначале файловая переменная F связывается «медленной» процедурой Assign со стандартным устройством CON (т.е. с экраном) и подсчитывается количество N1 циклов вывода некоторого текста за 5*55 = 275 миллисекунд системных часов. Затем файловая переменная связывается с экраном с помощью процедуры быстрого доступа AssignCRT и точно так же подсчитывается количество N2 циклов вывода. В конце программы счетчики N1 и N2 выводятся на экран.

Заметим, что показания системных часов хранятся в оперативной памяти компьютера в виде четырехбайтного слова по адресу [$0040:$006С] и наращиваются на единицу каждые 55 миллисекунд.

Uses CRT;

var

F: Text;

t: LongInt;{Начало отсчета времени}

N1,N2: Word;{Счетчики вывода}

const

txt = ' Text';

begin

{----- Стандартный вывод в файл -----}

Assign(F,'CON');

Rewrite(F);

N1 := 0;{Готовим счетчик вывода}

ClrScr;{Очищаем экран}

{Запоминаем начальный момент:}

t := MemL[$0040:$006C];

{Ждем начала нового 55-мс интервала, чтобы исключить погрешность в определении времени:}

while MemL[$0040:$006C]=t do;

{Цикл вывода за 5 интервалов}

while MemL[$0040:$006С]<t+6 do

begin

inc(N1) ;

Write(F,txt)

end;

Close(F);

{----- Вывод с помощью быстрой процедуры прямого доступа к экрану - ----}

AssignCRT(F);

Rewrite(F);

N2 := 0;

ClrScr;

t := MemL[$0040:$006C];

while MemL[$0040:$006C]=t do;

while MemL[$0040:$006C]<t+6 do

begin

inc(N2);

Write(F,txt)

end ;

Close(F);

{Печатаем результат}

ClrScr;

WriteLn(Nl,N2:10)

end.

Следует учесть, что вывод на экран обычным образом, без использования файловой переменной (например, оператором Write (txt)) также осуществляется с помощью непосредственного доступа к видеопамяти, поэтому ценность процедуры AssignCRT весьма сомнительна. Прямой доступ к видеопамяти регулируется глобальной логической переменной DirectVideo модуля CRT: если эта переменная имеет значение True, доступ разрешен, если False – доступ к экрану осуществляется с помощью относительно медленных средств операционной системы MS-DOS. По умолчанию переменная DirectVideo имеет значение True.