Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.01.2013, 15:20
gadmaker gadmaker вне форума
Прохожий
 
Регистрация: 19.04.2009
Сообщения: 49
Репутация: 10
Вопрос Помогите оптимизировать!

Пишу нечто похожее на 3D карту, структуру ячеек с шириной, высотой, и длинной по типу одномерного массива:

Код:
type TGrid3D = class(TObject)
public
 SizeX, SizeY, SizeZ: Integer;
 Grid3D: array of Byte;
end;

var
 Grid3D: array of TGrid3D;
 Grid3DNumber: Word = 0;

function DsGrid3dCreate(SX,SY,SZ: Double): Double; cdecl;
begin
 Result:=-1;
 if SX*SY*SZ>1024*1024*1024 then Exit;
 SetLength(Grid3D,Length(Grid3D)+1);
 Grid3D[Grid3DNumber]:=TGrid3D.Create;
 Grid3D[Grid3DNumber].SizeX:=Trunc(SX);
 Grid3D[Grid3DNumber].SizeY:=Trunc(SY);
 Grid3D[Grid3DNumber].SizeZ:=Trunc(SZ);
 SetLength(Grid3D[Grid3DNumber].Grid3D,Grid3D[Grid3DNumber].SizeX*Grid3D[Grid3DNumber].SizeY*Grid3D[Grid3DNumber].SizeZ);
 Result:=Grid3DNumber;
 Grid3DNumber:=Grid3DNumber+1;
end;

function DsGrid3dDestroy(ID: Double): Double; cdecl;
begin
 Result:=0;
 Grid3D[Trunc(ID)].Destroy;
 Result:=1;
end;

function DsGrid3dSet(ID, X, Y, Z, V: Double): Double; cdecl;
var r: Integer;
begin
 Result:=0;
 r:=Grid3D[Trunc(ID)].SizeX*Grid3D[Trunc(ID)].SizeY*Trunc(Z)+Grid3D[Trunc(ID)].SizeX*Trunc(Y)+Trunc(X);
 Grid3D[Trunc(ID)].Grid3D[r]:=Trunc(V);
 Result:=1;
end;

function DsGrid3dGet(ID, X, Y, Z: Double): Double; cdecl;
var r: Integer;
begin
 r:=Grid3D[Trunc(ID)].SizeX*Grid3D[Trunc(ID)].SizeY*Trunc(Z)+Grid3D[Trunc(ID)].SizeX*Trunc(Y)+Trunc(X);
 if (X<0) or (Y<0) or (Z<0) or
    (X>=Grid3D[Trunc(ID)].SizeX) or (Y>=Grid3D[Trunc(ID)].SizeY) or (Z>=Grid3D[Trunc(ID)].SizeZ)
 then Result:=-1 else Result:=Grid3D[Trunc(ID)].Grid3D[r];
end;

function DsGrid3dGetSize(ID, WHD: Double): Double; cdecl;
begin
 try
  Result:=-1;
  if WHD = 0 then Result:= Grid3D[Trunc(ID)].SizeX;
  if WHD = 1 then Result:= Grid3D[Trunc(ID)].SizeY;
  if WHD = 2 then Result:= Grid3D[Trunc(ID)].SizeZ;
 except
  Result:=-1;
 end;
end;

вопрос в оптимизации DsGrid3dGet т.к. для защиты от некорректного ввода пользователя используется условие т.е. код защищён от запроса на отсутствующую ячейку. Можно ли заменить условие чем-то более быстым, поскольку этот запрос наиболее востребыванный?

Последний раз редактировалось gadmaker, 27.01.2013 в 15:33.
Ответить с цитированием
  #2  
Старый 27.01.2013, 16:34
my33oh my33oh вне форума
Новичок
 
Регистрация: 17.12.2012
Сообщения: 93
Репутация: -579
По умолчанию

некоретный ввод проверяется во время ввода, а не каждое чтение ячейки
и второе, нахрена тут вообще class(TObject)
Ответить с цитированием
Этот пользователь сказал Спасибо my33oh за это полезное сообщение:
OTVET (28.01.2013)
  #3  
Старый 27.01.2013, 19:45
gadmaker gadmaker вне форума
Прохожий
 
Регистрация: 19.04.2009
Сообщения: 49
Репутация: 10
По умолчанию

это DLL расширение для скриптового языка те таких сеток может быть более одной. А проверка внутри функции нужна для исключения проверок в скрипте т.к. Delphi это сделает намного быстрее.
Ответить с цитированием
  #4  
Старый 28.01.2013, 17:41
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Ну для начала в каждую функцию добавить переменную
Код:
var
   Cell:TGrid3D;
и в самом начале
Код:
Cell := Grid3D[Trunc(ID)];
что бы не вычислять одно и тоже десять раз. И затем все операции делать с ней, например
Код:
function DsGrid3dCreate(SX,SY,SZ: Double): Double; cdecl; 
var
   Cell:TGrid3D;
begin 
  Result:=-1;  if SX*SY*SZ>1024*1024*1024 then Exit;  
  SetLength(Grid3D,Length(Grid3D)+1);  
  Cell:=TGrid3D.Create;
  Grid3D[Grid3DNumber]:=Cell;  
  Cell.SizeX:=Trunc(SX); 
  Cell.SizeY:=Trunc(SY);  
  Cell.SizeZ:=Trunc(SZ);  
  SetLength(Cell.Grid3D,Cell.SizeX*Cell.SizeY*Cell.SizeZ);  
  Result:=Grid3DNumber;  
  Grid3DNumber:=Grid3DNumber+1; 
end; 
и немного переставить проверки
Код:
function DsGrid3dGet(ID, X, Y, Z: Double): Double; cdecl; 
var 
  r,IX,IY,IZ: Integer; 
  Cell:TGrid3D;
begin
  Result:=-1;
  IX := Trunc (X);
  if (IX<0) then Exit;
  IY := Trunc (Y);
  if (IY<0)then Exit;
  IZ := Trunc (Z);
  if (IZ<0) then Exit;
  Cell := Grid3D[Trunc(ID)]; 
  if (IX>=Cell.SizeX) Then Exit;
  if (IY>=Cell.SizeY) Then Exit;
  if (IZ>=Cell.SizeZ) Then Exit;

  r:=Cell.SizeX*Cell.SizeY*IZ+Cell.SizeX*IY+IX;  

  Result:=Cell.Grid3D[r]; 
end; 
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
OTVET (28.01.2013)
  #5  
Старый 28.01.2013, 19:24
my33oh my33oh вне форума
Новичок
 
Регистрация: 17.12.2012
Сообщения: 93
Репутация: -579
По умолчанию

Цитата:
Сообщение от icWasya
...
это не оптимизация, а масло-масляное, читай справку по логическим операциям
Ответить с цитированием
  #6  
Старый 28.01.2013, 21:49
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

>масло масляное
Я экономил не булевские операции, а преобразования double-int
А вот здесь можно
Код:
r:=Cell.SizeX*Cell.SizeY*IZ+Cell.SizeX*IY+IX;

сэкономить одно умножение
Код:
r:=Cell.SizeX*(Cell.SizeY*IZ+IY)+IX;
Ответить с цитированием
  #7  
Старый 28.01.2013, 18:14
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

my33oh, а я только-только хотел тебя похвалить за грамотное замечание на тему class(TObject) и проверку на запись, а не чтение... А ты опять начинаешь троллить... Тебе недавнего бана не хватило? "Продлевать будете", как говорится?

На тему данного кода, действительно лишнее использование объектов, и странные проверки. Автор, почему не record?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось M.A.D.M.A.N., 28.01.2013 в 18:59.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025