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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2010, 12:45   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
Function InRect(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean;
Begin
 Result :=(X>X1)And(X<X2)And(Y>Y1)And(Y<Y2);
End;
выполняется до первой лжи, оптимизировать там никуда не нужно уже.
Цитата:
Итак что происходит при таком варианте написания.
Как только не выполняется хотя бы одно условие программа выходит из этой процедуры. Т.е. если не выполняется 1 условие то на все остальные программа даже не тратит ресурсы системы.

А в твоем варианте с and ты обрекаешь программу на проверку всех 4 условий.
1)вы не знаете как работает оптимизатор.
2)вы не знаете что такое быстрая булева алгебра.
так что ваш код будет гораздо больше по объему.(текста)
по ассемблеру он тот же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 04.06.2010 в 14:02.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.06.2010, 14:50   #12
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Ого! Не ожидал столько!
Я так понял, что наиболее оптимизированный вариант из предложенных -
Код:
Function InRect(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean;
Begin
 Result :=(X>X1)And(X<X2)And(Y>Y1)And(Y<Y2);
End;
Спасибо всем за помощь!
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.06.2010, 14:54   #13
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Все равно попробуй замерить время еще и для
Цитата:
((x2-x1)<(x-x1)) and аналогично для y
Мало-ли
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 04.06.2010, 15:21   #14
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
обрекаешь программу на проверку всех 4 условий.
Только если включено complete boolean eval ($B+)

InRect(X, Y, X1, Y1, X2, Y2 : Integer)
Заменить на
InRect(X, Y: Integer; rect: TRect) или InRect(point: TPoint; rect: TRect)

С 3 и менее параметрами компилятор будет использовать модель вызова fastcall (передача параметров через регистры) - сэкономит пару-тройку тактов
Можно попробовать дописать директиву inline - тогда в коде вместо вызова процедуры по возможности будет использоваться само тело процедуры

Кстати, есть готовая функция в Types
Код:
function PtInRect(const Rect: TRect; const P: TPoint): Boolean;
begin
  Result := (P.X >= Rect.Left) and (P.X < Rect.Right) and (P.Y >= Rect.Top)
    and (P.Y < Rect.Bottom);
end;
пыщь

Последний раз редактировалось JTG; 04.06.2010 в 15:37.
JTG вне форума Ответить с цитированием
Старый 04.06.2010, 15:25   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
С 3 и менее параметрами компилятор будет использовать модель вызова fastcall (передача параметров через регистры) - сэкономит пару-тройку тактов
он всегда её использует.
все чему не хватило места в регистрах идет через стек.
InRect(X, Y: Integer; rect: TRect) или InRect(point: TPoint; rect: TRect)
в регистрах не поместится, разве что юзая указатель var rect:TRect(во втором случае тоже Var нужен).
так что не вижу выгоды...один хрен память задействуется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.06.2010, 16:02   #16
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Угу, с var есть незначительный выигрыш в скорости

Код:
program rdtsc_view;

{$APPTYPE CONSOLE}

uses SysUtils, windows;


Function InRect(var X, Y, X1, Y1, X2, Y2 : Integer) : Boolean;
Begin
  Result :=(X>X1)And(X<X2)And(Y>Y1)And(Y<Y2);
End;

Function InRect2p(var point: TPoint; var Rect: TRect) : Boolean; 
Begin
  Result :=(point.X>Rect.left)And(point.X<rect.right)And(point.Y>rect.top)And(point.Y<rect.bottom);
End;

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


var St,En,Tm:Int64;
    I, J:Integer;
    x,y,x1,y1,x2,y2: integer;
    pt: TPoint;
    re: trect;

begin

randomize;
x := random(100);
y := random(100);
x1 := random(100);
x2 := random(100);
y1 := random(100);
y2 := random(100);

pt.x := x;
pt.y := y;
SetRect(re,x1,y1,x2,y2);

for j:=1 to 5 do
begin
  St:= tsc;
  for I := 0 to 1000000 do InRect(x,y,x1,y1,x2,y2);
  En:= tsc;
  Tm:=En-St;
  write(Tm:10,' ');
end;

writeln;

for j:=1 to 5 do
begin
  St:= tsc;
  for I := 0 to 1000000 do InRect2p(pt, re);
  En:= tsc;
  Tm:=En-St;
  write(Tm:10,' ');
end;

Readln;
end.
пыщь
JTG вне форума Ответить с цитированием
Старый 04.06.2010, 16:29   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
с var есть незначительный выигрыш в скорости
я имел ввиду про TRect и TPoint(варианты с ними)

тут скорее всего будет проигрыш скорости, ибо адресации по указателю, который находится на каком то адресе у нас нет.
будет
mov edx,[esp+4]
cmp ecx,edx//сравнение третьего и четвертого

а лучше
cmp ecx,[esp+4]

так что на самом деле, помоему оптимизировать уже не куда.
разве что стоит присмотреться к варианту Уткина, но и он не идеален.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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