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-24 17:30:00) [61]

Гм... правда здесь возникает другой вопрос: как по const передаются свойства? Видимо все гораздо хитрее...


Mx   (2005-05-24 17:26:00) [62]


> begin...end ©

Как я понял, const - это по адресу, но компилятор запрещает явное изменение ее значения. Скажем в передав по const массив record'ов мы сможем изменить значение его переменных, но не сможем изменить значение самой ссылки на массив, т.к. она const. Можно, кстати, проверить адреса - они совпадут.


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

Я думаю имеется ввиду безопасность того, что саму ссылку не изменят, но в качестве параметра будет передана именно она.


begin...end   (2005-05-24 17:19:00) [63]

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

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

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

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


Alx2   (2005-05-24 17:12:00) [64]

>begin...end ©   (24.05.05 17:11)
Я угадывать должен, что ты имеешь в виду?


Alx2   (2005-05-24 17:12:00) [65]

>alertus   (24.05.05 17:09) [12]

profiler - инструмент для построения "профиля" программы.
Профиль, если говорить карикатурно, - график "скорострельности" различных участков программы.


begin...end   (2005-05-24 17:11:00) [66]

> Alx2 ©   (24.05.05 17:03) [10]

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

Ну, и?


alertus   (2005-05-24 17:09:00) [67]

А что такое "профилер"??


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

>alertus   (24.05.05 17:03)

Без кода будет только телепатия :)
Высылай, если-что.


Alx2   (2005-05-24 17:03:00) [69]

>begin...end ©   (24.05.05 17:00) [7]
A constant (const) parameter is like a local constant or read-only variable. 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. (But when you pass an object reference as a constant parameter, you can still modify the object’s properties.)
Using const allows the compiler to optimize code for structured- and string-type parameters. It also provides a safeguard against unintentionally passing a parameter by reference to another routine.

Here, for example, is the header for the CompareStr function in the SysUtils unit:

function CompareStr(const S1, S2: string): Integer;

Because S1 and S2 are not modified in the body of CompareStr, they can be declared as constant parameters.


alertus   (2005-05-24 17:03:00) [70]

Я и так передаю по адресу, я же не передаю функции весь массив, а адрес первого элемента, в этом и есть идеалогия динамических массивов.


alertus   (2005-05-24 17:02:00) [71]

Я работаю не как с одномерным, я написал процедуры типа
TMatrix.GetElem(i,j:integer).
А вообще я просто не понял, как обращаться по другому к двумерным массивам, если я обращусь a[2,3]:=10 то возникает вопрос, а какова ширина матрици??
Ведь до этого мы указали только количество элементов, например:
Initialize(a,25)


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

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

> Также передачу параметров в процедуры/функции лучше делать
> по адресу (например, procedure name(const Value : Double)).

const -- это НЕ передача по адресу.


evvcom   (2005-05-24 16:57:00) [73]

А зачем array of array, если потом все равно работаешь как с одномерным?


Alx2   (2005-05-24 16:52:00) [74]

>alertus   (24.05.05 16:50) [4]

> это real=double, если не стоит
>{$REALCOMPATIBILITY ON}

Сорри. Действительно.

Тогда нужно профилировать.


alertus   (2005-05-24 16:50:00) [75]

2Alx2 уже пробовал, скорость не меняется, а с single точность намного меньше (0.1+0.2=0.300000011920929), а насчет double: как написано в help'е Delphi, это real=double, если не стоит

{$REALCOMPATIBILITY ON}

Если же поставить эту диррективу, то real=real48 (на скорости тоже почти не сказывается).

PS
скорость я тестирую так:
a:=0.7648654;
b:=0.79645784;
for i:=1 to 100000 do
 for j:=1 to 100000 do
   c:=a*b;
label1.caption:='!!!';


Alx2   (2005-05-24 16:50:00) [76]

Также передачу параметров в процедуры/функции лучше делать по адресу (например, procedure name(const Value : Double)).

Вообще, используй какой-нибудь профилер для поиска узких мест. Рекомендую VTune.


Alx2   (2005-05-24 16:44:00) [77]

Сразу: избегай real. Замени на Single или Double.


begin...end   (2005-05-24 16:43:00) [78]

> alertus   (24.05.05 16:40)

> Я знаю, что с динамическими массивами можно еще работать
> так:
> ...
> не знаю, будет ли выигрыш в скорости

Скорость операции доступа к элементу массива не увеличится.


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

Наверх

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