Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Быстрое заполнение дин. массива   Найти похожие ветки 

 
DelphiLexx ©   (2007-01-09 09:56) [0]

У меня есть два массива

APoints: array of TPoint
_Points: array of TPoint

1. Можно ли перенисти все элементы массива APoints в Points не используя цикла?
2. Есть массив

StrokeList: array of DWORD

Который может иметь произвольное число элементов, как мне быстро заполнить его элементы значением числа 2.


 
Джо ©   (2007-01-09 10:11) [1]

1. Если TPoint это то, о чем я думаю, то:
type
 TPointArray = array of TPoint;
var
 Pa1,
 Pa2: TPointArray;
begin
 SetLength (Pa2,Length(Pa1));
 Move (Pa1[0],Pa2[0],Length(Pa1)*SizeOf(TPoint));


 
Сергей М. ©   (2007-01-09 10:15) [2]

1.
SetLength(_Points, Length(APoints));
CopyMemory(@_Points[0], @APoints[0], Length(APoints)*SizeOf(TPoint));

2. В цикле.


 
Palladin ©   (2007-01-09 10:16) [3]

1. можно SetLength(_Points,Length(APoints)); Move(APoints[0],_Points[0],Length(APoints)*SizeOf(TPoint));
2. хем... можно, но сложно... долго писать...


 
Джо ©   (2007-01-09 10:16) [4]

2. Не вижу пути быстрее, чем for I := 0 High(StrokeList) do StrokeList[I] := 2;


 
Сергей М. ©   (2007-01-09 10:21) [5]


> Джо ©   (09.01.07 10:16) [4]


Ну почему же ? "Чистый" rep stosd даст некое преимущество по производительности. Хотя вряд ли оно автору надо)


 
Джо ©   (2007-01-09 10:22) [6]

> [5] Сергей М. ©   (09.01.07 10:21)
>
> > Джо ©   (09.01.07 10:16) [4]
>
>
> Ну почему же ? "Чистый" rep stosd даст некое преимущество
> по производительности. Хотя вряд ли оно автору надо)

Да можно много напридумывать, я ж не спорю :)


 
Сергей М. ©   (2007-01-09 10:33) [7]

2.

Примерно так:

function FillBufferOfDWords(Value: DWord; Buffer: Pointer; Count: Integer);
asm
 xchg edx, edi
 cld
 rep stos dword ptr [edi]
 xchg edx, edi
end;

..

// if Lenght(StrokeList) >0 then //!!!!!
FillBufferOfDWords(2, @StrokeList[0], Lenght(StrokeList));


 
Джо ©   (2007-01-09 10:41) [8]

> [7] Сергей М. ©   (09.01.07 10:33)
> 2.
>
> Примерно так:


От нечего делать проверил :)

program Project2;

{$APPTYPE CONSOLE}

uses
 Windows, SysUtils;

type
 TDwordArray = array of Dword;

procedure FillBufferOfDWords(Value: DWord; Buffer: Pointer; Count: Integer);
asm
xchg edx, edi
cld
rep stos dword ptr [edi]
xchg edx, edi
end;

var
 Da: TDwordArray;
 I: Integer;
 Tc: Cardinal;
begin
 SetLength (Da,100000000);

 //Холостой прогон ;-)
 for I := 0 to Length(Da)do
   Da[I] := 2;

 //1
 Tc := GetTickCount;
 for I := 0 to Length(Da)do
   Da[I] := 2;
 WriteLn (GetTickCount-Tc);

 //2
 Tc := GetTickCount;
 FillBufferOfDWords(2,@Da[0],Length(Da));
 WriteLn (GetTickCount-Tc);

 ReadLn;
end.


У меня оба варианта выполняются 281 тик (+-1) ;)
С включенной оптимизацией.


 
evvcom ©   (2007-01-09 10:56) [9]

> [1] Джо ©   (09.01.07 10:11)
> Move (Pa1[0],Pa2[0],Length(Pa1)*SizeOf(TPoint));

Не пойдет, автор просил без цикла, а внутри Move есть цикл! :)))


 
Сергей М. ©   (2007-01-09 11:15) [10]


> Джо ©   (09.01.07 10:41) [8]


Тут надо учитывать конкретный CPU)


 
Anatoly Podgoretsky ©   (2007-01-09 13:46) [11]

>   ()  []

А теперь перепиши это без rep stos


 
Loginov Dmitry ©   (2007-01-09 17:11) [12]

> У меня есть два массива
>
> APoints: array of TPoint
> _Points: array of TPoint
>
> 1. Можно ли перенисти все элементы массива APoints в Points
> не используя цикла?


_Points := Copy(APoints);

это копирование

А перенос - это:

_Points := APoints;
Integer(APoints) := 0;


 
Сергей М. ©   (2007-01-09 17:30) [13]


> Integer(APoints) := 0;


А эт чего ?


 
ors_archangel ©   (2007-01-09 20:01) [14]


> _Points := APoints;
>  Integer(APoints) := 0;

Помойму всё-таки

_Points := APoints;

хватит, ref-counting сам всё сделает


 
Loginov Dmitry ©   (2007-01-10 07:57) [15]

> А эт чего ?


Ничего. Лопухнулся. См [14].
:)



Страницы: 1 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.055 c
2-1168212195
koha
2007-01-08 02:23
2007.01.28
Модуль Compress.pas - распаковка ресурсов в файл


15-1168535854
Andy BitOff
2007-01-11 20:17
2007.01.28
Рекламный ход. Какие ассоциации? =)


11-1146570888
DVK
2006-05-02 15:54
2007.01.28
Как перетаскивать форму не за заголовок


15-1168001545
Anatoly Podgoretsky
2007-01-05 15:52
2007.01.28
День рождения шефа


8-1149080259
zxcv
2006-05-31 16:57
2007.01.28
StretchDraw(Width х Height)