Процедуры и функции
Процедура 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.