IPB
ЛогинПароль:

> Внимание! Действует предмодерация

Подраздел FAQ (ЧАВО, ЧАстые ВОпросы) предназначен для размещения готовых рабочих программ, реализаций алгоритмов. Это нечто вроде справочника, он наполнялся в течение 2000х годов. Ваши вопросы, особенно просьбы решить задачу, не пройдут предмодерацию. Те, кто наполнял раздел, уже не заходят на форум, а с теми, кто на форуме сейчас, лучше начинать общение в других разделах. В частности, решение задач — здесь.

> Улучшение кода, Уменьшение времени работы программ
сообщение
Сообщение #1


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


Быстрые циклы.

Всего тестировалось 4 конструкции:
  • "FOR ... TO ... Do...",
  • "WHILE... do...",
  • "REPEAT ... until ...",
  • " If... Then GOTO ..."

Проведение теста:
сортировка массива (array[1..20] of integer) методом пузырька.
Всего было проведено 30 тестов :
10 c n= 10^4;
10 c n= 10^5;
10 c n= 10^6;
и один тест с n=10^7 (один, т.к. с увеличением степени n на 1, время проведения теста увеличивается соответственно в 10 раз)


Результат:
Во всех случаях (каждый тест - новый массив) самой быстрой конструкцией оказалась "While ... do...", следом за ней "If ... then Goto..."


Прикрепленные файлы
Прикрепленный файл  test.pas ( 1.76 килобайт ) Кол-во скачиваний: 669


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Oleg_Z, вот чего у меня в книге есть:
Функции Overlay'а:
OvrClearBuf - очищает буфер smile.gif
OvrGetBuf - возвр. размер буфера
OvrGetRetry - возвр. размер области испытаний (что за она не въехал, но по-умолчанию тут 0).
OvrInit - инициализирует систему Overla'ев и открывает оверлейный файл.
OvrInitEMS - загружает оверлейный файл в память EMS, если это возможно.
OvrSetBuf - устанавливает размер буфера
OvrSetRetry - догадайся сам, хотя не стоит smile.gif
Так же тут описана переменная OvrResult:Integer, которая может быть
OvrOK(0) - всё пучком
OvrError(-1) - что-то не пучком
OvrNotFound(-2) - файл не нашёл
OvrNoMemory(-3) - досадно как...
OvrIOError(-4) - файл есть, атолку нет
ObrNoEMSDriver(-5) - и такое бывает
OvrNoEMSMemory(-6) - а драйвер тогда зачем?
Ещё в модуле есть возможность переопределить такую фигню:
Type
OvrReadFunc=Function(OvrSeg:Word):Integeer;
Var
OvrReadBuf:OvrReadFunc; { *** }
OvrFileMode:Byte;

Но зачем и что тут к чему я тоже что-то не того...
А ещё в System есть стадо переменных предназначенных для Overlay'а:
OvrCodeList:Word=0 - список сегментов кода
OvrDebugPtr:Pointer=Nil - для отладчика
OvrDOSHandle:Word=0 - для админа (скорее всего Handle файла)
OvrEMSHandle:Word=0 - Handle EMS-куска
OvrHeapEnd,OvrHeadOrg,OvrHeadPtr,OvrHeapSize:Word=0 - это если без EMS
OvrLoadList:Word=0 - "используется администратором оверлеев". И без коментариев.
Потешное замечание сделано в этой книге: не надо размещать в Overla'ях обработчики прерываний и данные для RegisterBGIDriver и RegisterBGIFont smile.gif

Далее идёт пример:
{$M 16384,65536,655360}
{$D-,F+}
{D- для того, чтобы Deug-Data не скидывались в Exe-шник. Тогда можно .Ovr приаттачить к самому .Exe}

Uses Crt,Overlay,Ovr_Init,Ovr1,Ovr2;

Var
 ch:Char;

Procedure UseOverlay;
Begin
 OutPut1 {Из Ovr1}
End;

Begin
 Repeat
   clrScr;
   Write('Press any key to start ovrlays or ESC to quit');
   ch:=ReadKey;
   WriteLn;
   If ch<>#27 Then
     UseOverlay
 Until ch=#27
End.


Unit OvrInit;
Interface
Implementation
Uses Overlay,Crt;
CONST
 OvrBufSize=100000;
Begin
 ClrScr;
 OvrInit(ParamStr(0)); {!!! Предполагается, что .Ovr прилеплен к .Exe}
 If OvrResult<>OvrOk Then
 Begin
   WriteLn('ERROR!!!);
   Halt
 End;
 OvrInitEMS;
 If OvrResult<>OvrOk Then
 Begin
   WriteLn('ERROR!!!);
   Halt
 End;
 OvrSetBuf(OvrBufSize);
 If OvrResult<>OvrOk Then
 Begin
   WriteLn('ERROR!!!);
   Halt
 End;
 OvrSetRetry(OvrBufSize Div 3) {Div 3 - оптимальный вариант, но всё ещё не понятно, что за область такая}
End.

Далее берём и Build'им саму прогу. А потом выходим из BP и пишем в cmd Copy /B Proga.Exe+Overlay.Ovr (или что-то типа того). Всё теперь можно запускать.
Хотя рекомендуется не использовать Overlay во время Debug'а (какой геморрой надо преодолеть, чтобы запустить прогу).
Вот так вот. Если ещё чего - спрашивай, может найду...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Altair   Улучшение кода   7.03.2004 17:39
mj   на процессорах P2 и ниже FOR быстрее чем WHILE до…   13.03.2004 22:09
Atos   И Да ЗдравствуетИтерация! Пример: старая добра…   16.03.2004 18:44
trminator   [b]Ускорение вычислений mod Програма считает 50 -…   15.05.2004 22:53
P@sh@   [color=blue]Деление на степень двойки Аналогично …   16.05.2004 0:08
P@sh@   Разворачивание циклов. -=loops unrolling=- Один и…   17.05.2004 22:42
trminator   P@sh@, сомневаюсь, что игра стОит свеч. Хотя попро…   19.05.2004 23:35
Altair   Процедуры FAR Все процедуры в модулях, пишутся в …   25.05.2004 18:28
BlackShadow   Специально для Oleg_Z: В BP есть такая возможность…   25.05.2004 20:26
BlackShadow   Описалова в книгах достаточно. Посмотрю чего - зав…   26.05.2004 2:46
trminator   Как нам говорили на лекции по ОС, оверлей - аналог…   27.05.2004 22:30
trminator   А про использование AssignCRT вместо Assign для за…   27.05.2004 22:37
BlackShadow   Ну и зкономии ради можно (олимпиадныю трюк) воспол…   28.05.2004 1:40
Altair   Просто есть файловая переменная Input и output тол…   28.05.2004 1:44
trminator   Про сортировку. Понятно, что пузырек и компания ни…   28.05.2004 3:04
BlackShadow   trminator, да похоже на пирамидку. Oleg_Z, использ…   28.05.2004 15:36
trminator   Так... я не закончил про сортировки :) ИМХО, испол…   29.05.2004 19:32
BlackShadow   trminator, по памяти, может, её и проще, но на реф…   31.05.2004 15:08
BlackShadow   Oleg_Z, вот чего у меня в книге есть: Функции Over…   31.05.2004 15:43
Altair   То есть ты хочешь сказать, что если описать : va…   31.05.2004 19:44
BlackShadow   А, если ты напишешь так: Var  a,b:Inte…   31.05.2004 20:04
Romtek   Взято из ООП. Объектно-ориентированное программиро…   8.06.2004 2:25
Altair   Begin и end лишние видимо я поставил, а вот объеди…   8.06.2004 17:52
BlackShadow   Вспомнил один момент такой. При работе с дробями, …   15.06.2004 16:32
Altair   Нет, ассемблер нужно применять только для шлифовк…   15.06.2004 23:27
Romtek   Complete boolean evaluation (compiler option)   16.06.2004 2:08
BlackShadow   Да уж, Oleg_Z, это действительно отключается дирек…   16.06.2004 17:42
Altair   BlackShadow, в следующий раз оформляй логические …   16.06.2004 19:20
Romtek   В первом случае имеем 2 операции, а во втором - 3   16.06.2004 20:15
Altair   Да, но во первых операция NOT ИМХО должна выполнят…   17.06.2004 0:24
Altair   Вот еще: Если в программе используется write и wri…   17.06.2004 17:34
Altair   REAL почти в 2 раза медленнее [b]ВСЕХ других число…   18.06.2004 18:05
P@sh@   Oleg_Z Real потому медленнее, что у него размер н…   26.06.2004 11:41
BlackShadow   Int64 появился только в 32-битных компиляторах. По…   2.07.2004 19:23
Atos   А вот это, мне кажется, интересно: Простой пример:…   16.10.2004 12:13
BlackShadow   Atos, ну это и лосю понятно. При последовательном …   19.10.2004 1:24
Atos   В каком именно Паскале? Ну, я же не лось... Не…   19.10.2004 10:17
GoodWind   Borland Turbo Pascal 7.0 TMT pascal да и во всех …   19.10.2004 16:17
Atos   Действительно... Просто никогда её не использовал.…   19.10.2004 17:51
Altair   Странно, тестирую бытсрую и пирамидальную на скоро…   7.11.2004 19:14
Altair   Да, все верно, [color=blue]пирамида медленнее чем…   7.11.2004 20:24
Dark   Просто память физически устроена как конденсаторы …   9.11.2004 5:23
volvo   [b]Обмен значений в переменных. Для увеличения ск…   22.01.2005 23:39


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.05.2024 12:22
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name