Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2010, 21:21   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Оптимизация функции с "<" и ">"

Мож^WКак оптимизировать следующую функцию?
Код:
Function InRect(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean;
Begin
 If (X>X1) And (X<X2) And
    (Y>Y1) And (Y<Y2) Then Result := TRUE
                      Else Result := FALSE;
End;
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 03.06.2010, 21:31   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Что вы имеете в виду под - оптимизировать? Сократить код или уменьшить время выполнения?
Sibedir вне форума Ответить с цитированием
Старый 03.06.2010, 21:39   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Разумеется уменьшить время.

Как внутри маш. кода происходит > и <?
Может анализируя это можно провести оптимизацию?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 03.06.2010, 21:43   #4
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну для начала
Код:
Result := (X>X1) And (X<X2) And (Y>Y1) And (Y<Y2);
Sibedir вне форума Ответить с цитированием
Старый 03.06.2010, 21:44   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Как внутри маш. кода происходит > и <?
View->Debug->CPU
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.06.2010, 22:20   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Код:
{$B-}
Думаю, вы это и так знаете, к тому же она и поумолчанию отключина. Так на всякий случай.
Sibedir вне форума Ответить с цитированием
Старый 04.06.2010, 07:27   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Сам IF истинное условие выполняет быстрей, чем ложное, постарайся сделать так, чтобы истинное условие наступало чаще. Можно попытаться перестроить выражения через математические операции, или через сравнение с константой (например, если самое меньшее число принять за нуль)
и сравнить время выполнения (например, в цикле на миллион сравнений).
Например:
Код:
if ((x2-x1)<(x-x1)) and аналогично для y then ...
Также условия можно попытаться разбить на 2 и более. Ведь если одно условие не выполняется, то нет смысла проверять остальные это же and.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 04.06.2010 в 07:34.
Utkin вне форума Ответить с цитированием
Старый 04.06.2010, 07:42   #8
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Сделать Вложенные if и отказаться от and.
Function InRect(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean;
Begin
Result := False;
If (X>X1) then
if (X<X2) then
if (Y>Y1) then
if (Y<Y2) then
Result := TRUE;
end;

Итак что происходит при таком варианте написания.
Как только не выполняется хотя бы одно условие программа выходит из этой процедуры. Т.е. если не выполняется 1 условие то на все остальные программа даже не тратит ресурсы системы.

А в твоем варианте с and ты обрекаешь программу на проверку всех 4 условий.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Старый 04.06.2010, 07:53   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от rdama Посмотреть сообщение
Сделать Вложенные if и отказаться от and.
Function InRect(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean;
Begin
Result := False;
If (X>X1) then
if (X<X2) then
if (Y>Y1) then
if (Y<Y2) then
Result := TRUE;
end;

Итак что происходит при таком варианте написания.
Как только не выполняется хотя бы одно условие программа выходит из этой процедуры. Т.е. если не выполняется 1 условие то на все остальные программа даже не тратит ресурсы системы.

А в твоем варианте с and ты обрекаешь программу на проверку всех 4 условий.
А что если точки будут часто находиться в прямоугольной области? Тогда твой код будет гораздо медленней предыдущего.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 04.06.2010, 08:42   #10
rdama
Форумчанин
 
Аватар для rdama
 
Регистрация: 25.07.2009
Сообщений: 533
По умолчанию

Ну да есть такая кухня.
Вот для потестить.
program rdtsc_view;

{$APPTYPE CONSOLE}

uses
SysUtils,
windows;

Function InRectO(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean;
Begin
If (X>X1) And (X<X2) And
(Y>Y1) And (Y<Y2) Then Result := TRUE
Else Result := FALSE;
End;

Function InRectM(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean;
Begin
Result := False;
If (X>X1) then
if (X<X2) then
if (Y>Y1) then
if (Y<Y2) then
Result := TRUE;
end;

function tsc: Int64;
var ts: record
case byte of
1: (count: Int64);
2: (b, a: cardinal);
end;
begin
asm
db $F;
db $31;
mov [ts.a], edx
mov [ts.b], eax
end;
tsc:=ts.count;
end;

function calibrate_runtime:Int64;
var i:byte; tstsc,tetsc,crtm:Int64;
begin
tstsc:=tsc;
crtm:=tsc-tstsc;
for i:=0 to 9 do
begin
tstsc:=tsc;
crtm:=tsc-tstsc;
if tetsc<crtm then crtm:=tetsc;
end;
calibrate_runtime:=crtm;
end;

var St,En,Tm,Tm1:Int64;
I:Integer;

begin
for I := 0 to 9 do
begin
Writeln('Parameters | Orig | Modify ');
St:= tsc;
InRectO(0,50,50,0,25,25);
En:= tsc;
Tm:=En-St;
St:= tsc;
InRectM(0,50,50,0,25,25);
En:= tsc;
Tm1:=En-St;
Writeln('InRect(0,50,50,0,25,25) | '+IntToStr(Tm)+' | '+IntToStr(Tm1));
St:= tsc;
InRectO(100,100,80,50,120,140);
En:= tsc;
Tm:=En-St;
St:= tsc;
InRectM(100,100,80,50,120,140);
En:= tsc;
Tm1:=En-St;
Writeln('InRect(100,100,80,50,120,1 40) | '+IntToStr(Tm)+' | '+IntToStr(Tm1));
St:= tsc;
InRectO(80,100,80,50,40,140);
En:= tsc;
Tm:=En-St;
St:= tsc;
InRectM(80,100,80,50,40,140);
En:= tsc;
Tm1:=En-St;
Writeln('InRect(80,100,80,50,40,140 ) | '+IntToStr(Tm)+' | '+IntToStr(Tm1));
St:= tsc;
InRectO(150,50,50,0,225,125);
En:= tsc;
Tm:=En-St;
St:= tsc;
InRectM(150,50,50,0,225,125);
En:= tsc;
Tm1:=En-St;
Writeln('InRect(150,50,50,0,225,125 ) | '+IntToStr(Tm)+' | '+IntToStr(Tm1));
end;
Readln;
end.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA)
rdama вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
DebugAPI перехват функции "на" и "после" Cj_ Win Api 1 20.04.2010 01:11
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04