Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
15-1168402510
Slider007
2007-01-10 07:15
2007.01.28
С днем рождения ! 10 января


2-1168562024
Cemen
2007-01-12 03:33
2007.01.28
Копирование массива рекордов?


15-1168343600
vasIzmax
2007-01-09 14:53
2007.01.28
Тест на уникальный ник :)


2-1168713511
Garacio
2007-01-13 21:38
2007.01.28
Часть названия файла


1-1164984707
w666w
2006-12-01 17:51
2007.01.28
Как распаковать Zip из строки в строку.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский