Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ускорение работы с динамическими массивами


Страницы:   1 2 3 4

alertus ©   (2005-05-24 16:40:00) 

Добрый день, подскажите, пожалуйста, что делать.
Я написал довольно сложный алгоритм (моделирование и обучение нейронных сетей). Все восхитительно работает, но медленно :((

Написал несколько классов для работы с матрицами, нейронными слоями и нейронными сетями, там все построено на динамических массивов real.

Я делаю это так:
var
 a:array of array of real; //матрица
const
 w = 10; //ширина
 h = 5;  //высота
.....
Initialize(a);
SetLength(a,w*h);
i:=2; //столбец
j:=4; //строка
a[j+(i-1)*w]:=0.5; //установим елемент
Finalize(a);


Ну и т.п. все это забито в методы, например
TMatrix.SetElem(i,j:integer;r:real);

Я знаю, что с динамическими массивами можно еще работать так:
type
 myarray = array[1..1000] of real;
 pmyarray = ^myarray;
var
 a:pmyarray;
const
 w = 10;
 h = 5;
.....
i:=2;
j:=4;
getmem(a,w*h*sizeof(real));
a^[j+(i-1)*w]:=0.5;
freemem(a);


Но переписывать все очень долго и не знаю, будет ли выигрыш в скорости.
Может быть вообще надо отказаться от объектно-орентированной концепции, будет не так красиво, но быстро (под вопросом).

Подскажите, пожалуйста, кто сталкивался с подобными вопросами.
Может быть вообще скорость теряется не на динамических массивах, а на многочисленных арифметический операциях, как тогда ускорить их, я уже подумал о
asm
end;


Mx   (2005-05-25 02:19:00) [41]


> Defunct ©

В курсе в курсе...


> GuAV ©
> Разумеется, рабочая копия создаётся кодом вызываемой функции.

Теперь понятно.


GuAV   (2005-05-25 01:07:00) [42]

к [35]

Разумеется, рабочая копия создаётся кодом вызываемой функции.

Это верно для соглашений register и pascal.
для cdecl или stdcall (safecall) запись переданная без const/var/out педедаётся по значению.


Defunct   (2005-05-25 00:35:00) [43]

Mx ©   (24.05.05 21:45) [34]

Вы в курсе что такое ESP? Если нет, тогда [35] трудно будет совместить с вашим CPU View из [32].


GuAV   (2005-05-25 00:25:00) [44]

Mx ©   (24.05.05 21:45) [34]

Записи, которые не помещающиеся в маш слово, всегда передаются по ссылке. Для таких записей переданных без const/var/out при необходимости создаётся рабочая копия ( "собака"Value возвращает именно её адрес).

см [33]


Mx   (2005-05-24 21:45:00) [45]

Я тока не понял почему в EAX все разы записывается ESP, но "собака"Value в Func1 возвращает адрес отличный от TForm1.Create, Func2, Func3 - в них он идентичен.


VMcL   (2005-05-24 21:41:00) [46]

>> Alx2 ©   (24.05.05 16:50) [3]

"const" имеет особый смысл в плане оптимизации для объектов с управляемым временем жизни (long strings, dynamic arrays, interfaces) и объектов структурного (record) или массивного (array) типа.


Mx   (2005-05-24 21:15:00) [47]

Совсем интересно, может кто разъяснит? Судя по CPU View во всех трех случаях, после замены типа формального параметра на простенький record с двумя Integer'ами, в EAX помещается ESP, однако оператор @ показывает в случае Func1 все-равно возвращает число, отличное от Func2/Func3:


type
 TM = record
   S: Integer;
   B: Integer;
 end;

function Func1(Value: TM): Integer;
begin
Result := Value.S;
end;

function Func2(var Value: TM): Integer;
begin
Result := Value.S;
end;

function Func3(const Value: TM): Integer;
begin
Result := Value.S;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
I: TM;
begin
I.S := 1;
I.B := 2;
Func1(I);
Func2(I);
Func3(I)
end;


в CPU View:

MOV  [ESP],$1
MOV  [ESP+$4],$2

MOV  EAX,ESP
CALL FUNC1

MOV  EAX,ESP
CALL FUNC2

MOV  EAX,ESP
CALL FUNC3


Mx   (2005-05-24 21:03:00) [48]


> begin...end ©
> Конечно, не передадите

Спасибо, конечно, но ты почему-то совсем не то видишь в моих постах. Я понимаю, что свойство - не переменная и написал так с той самой целью, что const не обязательно ссылка, потому как на свойство ссылку не передать.

Так как быть с record'ом? В случае передачи по const адрес переменной один и тот же, а в случае без const - разный.


malkolinge   (2005-05-24 18:34:00) [49]

VarArrayLock()


Alx2   (2005-05-24 18:12:00) [50]

И все-таки не пойму. Зачем нужно const extended передавать по значению? Только лишние траты. Чего-то я не учитываю...


begin...end   (2005-05-24 17:55:00) [51]

> Mx ©   (24.05.05 17:39) [22]

> В качестве var'а свойство объекта мы не передадим, а через
> const пожалуйста.

Конечно, не передадите. Свойство -- это ведь не переменная. И у него нет адреса. А вот значение -- есть.


Alx2   (2005-05-24 17:55:00) [52]

>begin...end ©   (24.05.05 17:49)

Сыплю пепел на голову. Спасибо за развенчивание моего мифа относительно const. Черт, а ведь был твердо уверен :)
Пошел учить матчасть.


Mx   (2005-05-24 17:50:00) [53]


> Alx2 ©

Возможно. А как быть с параметрами типа Extended? Свойство, возвращаемое по функции тоже можно передать как Const, ссылки не будет, но значение больше 4 байт.


begin...end   (2005-05-24 17:49:00) [54]

> Alx2 ©   (24.05.05 17:37) [21]

function Func1(Value: Integer): Integer;
begin
 Result := Value
end;

function Func2(var Value: Integer): Integer;
begin
 Result := Value
end;

function Func3(const Value: Integer): Integer;
begin
 Result := Value
end;

var
 I: Integer;
begin
 I := 1;
 Func1(I);
 Func2(I);
 Func3(I)
end.


>> Да и в окне CPU всё видно, вообще-то.
> Вот-вот. Там и видно.

Не знаю, что видно у Вас, а у меня видно следующее:

mov [esp],$00000001

mov eax,[esp]
call Func1

mov eax,esp
call Func2

mov eax, [esp ]
call Func3


> Alx2 ©   (24.05.05 17:42) [24]

Замените в приведённом коде Integer на Extended. Что-то принципиально поменяется?


Alx2   (2005-05-24 17:42:00) [55]

> begin...end ©
Возможно, будет важным дополнением: если параметр целиком помещается в 4 байта, то передается по значению. Если нет - по ссылке.


alertus   (2005-05-24 17:42:00) [56]

Раз уж речь зашла.
Я так понимаю, var - это передача по ссылке, а const - нет, значит по значению

> It also provides a safeguard against unintentionally passing
> a parameter by reference to another routine.

То есть если программист не хочет нечаянно передать функции параметр по ссылке, чтобы та его не изменила ненароком, он пишет const...


Mx   (2005-05-24 17:39:00) [57]


> begin...end ©

В качестве var'а свойство объекта мы не передадим, а через const пожалуйста. Это я имел ввиду.

Сейчас проверил: если передать record без const, то адреса - разные, а если через const - одинаковые.


> похожи на параметры по значению

Похожи не значат, что именно так.


Alx2   (2005-05-24 17:37:00) [58]

>begin...end ©   (24.05.05 17:19)

> Alx2 ©   (24.05.05 17:12) [15]

> It also provides a safeguard against unintentionally passing
> a parameter by reference to another routine .

>Перевожу: "Это также обеспечивает защиту против
>непреднамеренной передачи параметра по ссылке в другую
>подпрограмму".

>Теперь ответьте на вопрос: следует ли из этой фразы, что
>параметр с модификатором const передаётся по адресу, как Вы
>заявили в [3]?

Сорри, с выделенным фрагментом наврал. Конечно, именно из этой фразы не следует.

Но параметр передается по ссылке.

>Да и в окне CPU всё видно, вообще-то.

Вот-вот. Там и видно.


begin...end   (2005-05-24 17:32:00) [59]

> Mx ©   (24.05.05 17:30) [18]

Какие свойства?


begin...end   (2005-05-24 17:31:00) [60]

> Mx ©   (24.05.05 17:26) [17]

> Как я понял, const - это по адресу ...

Читаем процитированный выше хелп:

> Constant parameters are similar to value parameters, except
> that you can’t assign a value to a constant parameter within
> the body of a procedure or function, nor can you pass one
> as a var parameter to another routine.

и переводим:

"Константные параметры похожи на параметры по значению, однако вы не можете присваивать значение константному параметру в теле процедуры или функции, и вы не можете передавать его как параметр по ссылке в другую подпрограмму."

Откуда следует, что const -- это передача по ссылке?

Да и в окне CPU всё видно, вообще-то.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо