powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрый список TArrayEx
25 сообщений из 40, страница 1 из 2
Быстрый список TArrayEx
    #39763890
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что в нём особенного?
1) Отказ от integer в пользу NativeUInt
1.1) У списка не должно быть отрицательных чисел, включая управляющие процедуры
1.2) На 32 битной платформе доступно 4294967295 записей вместо 2147483647
1.3) На 64 битной платформе будет доступно 18446744073709551615

2) В два раза быстрее добавляет записи ! Чем стандартный TList<>
2.1) Стандартный отрабатывает за 0.971365 - 1.006337
+
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure Test;
var
  arr: TList<Integer>;
  i: Integer;
begin
  arr := TList<Integer>.Create;
  with arr do
  begin
    for i := 0 to 50000000 do
      add(i);
  end;
end;


2.2) Данный класс отрабатывает 0.527339 - 0.530999
+
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure Test; 
var
  arr: TArrayEx<Integer>;
  i: Integer;
begin
  with arr do
  begin

    init;

    for i := 0 to 50000000 do
      add(i);
  end;
end;



3) Малое потребление памяти.
3.1) Стандартный при 50000000 записей - 262 МБ
3.2) Данный класс при 50000000 - 197 МБ

Сам класс
+
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
// VER: 0.0.1
// Author: Гирлионайльдо

unit FastListArray;

interface

uses
  System.SysUtils, System.Generics.Defaults;

type
  PDynArrayRec = ^TDynArrayRec;

  TDynArrayRec = packed record
{$IFDEF CPU64BITS}
    _Padding: Integer; // Make 16 byte align for payload..
{$ENDIF}
    RefCnt: Integer;
    Length: NativeInt;
  end;

  TArrayExSortCompare<T> = function(Item1, Item2: T): Integer;
  TArrayExSortCompareFunc<T> = reference to function(Item1, Item2: T): Integer;

  TArrayEx<T> = record
  public
    Items: TArray<T>;
    CurrentLength, MaxLength: NativeUInt;
    Comparer: IComparer<T>;
  public
    procedure init;
    procedure free;
    procedure add(Value: T);
    function IndexOf(Item: T): NativeUInt;
    function Delete(i: NativeUInt): T;
    function Remove(Item: T): NativeUInt;
    procedure Move(CurIndex, NewIndex: NativeUInt);
    procedure Insert(Index: NativeUInt; Item: T);
    procedure Sort(Compare: TArrayExSortCompare<T>);
    procedure SortList(const Compare: TArrayExSortCompareFunc<T>);
    function First: T;
    function Last: T;
  private
    procedure QuickSort(var SortList: TArray<T>; L, R: NativeUInt;
      SCompare: TArrayExSortCompareFunc<T>);

  type
    Test = TArray<T>;

  const
    elSize = SizeOf(Pointer);
    Plus = 48;
  end;

implementation

procedure TArrayEx<T>.init;
begin
  if NativeUInt(Items) <> 0 then
    free;

  Comparer := TComparer<T>.Default;
  CurrentLength := 0;
  MaxLength := Plus;
  PPointer(@Items)^ := SysGetMem(MaxLength * elSize + SizeOf(TDynArrayRec));
  Inc(PByte(Items), SizeOf(TDynArrayRec));
end;

procedure TArrayEx<T>.free;
begin
  Dec(PByte(Items), SizeOf(TDynArrayRec));
  SysFreeMem(PPointer(@Items)^);
  CurrentLength := 0;
  MaxLength := 0;
  PPointer(@Items)^ := nil;
end;

procedure TArrayEx<T>.add(Value: T);
begin
  if MaxLength < CurrentLength then
  begin
    Inc(MaxLength, Plus);
    Dec(PByte(Items), SizeOf(TDynArrayRec));
    PPointer(@Items)^ := SysReallocMem(PPointer(@Items)^,
      MaxLength * elSize + SizeOf(TDynArrayRec));
    Inc(PByte(Items), SizeOf(TDynArrayRec));
  end;

  Test(Items)[CurrentLength] := Value;

  Inc(CurrentLength);

  PNativeInt(PByte(Items) - SizeOf(NativeInt))^ := CurrentLength;
end;

function TArrayEx<T>.IndexOf(Item: T): NativeUInt;
var
  i: NativeUInt;
begin
  i := CurrentLength;
  while i <> NativeUInt.MaxValue do
  begin
    if Comparer.Compare(Items[i], Item) = 0 then
      exit(i);
    Dec(i);
  end;
  Result := NativeUInt.MaxValue;
end;

function TArrayEx<T>.Delete(i: NativeUInt): T;
begin
  if i <= MaxLength then
  begin
    Dec(MaxLength);
    System.Move(Test(Items)[i + 1], Test(Items)[i],
      (MaxLength - i) * SizeOf(elSize));

    Dec(CurrentLength);

    PNativeInt(PByte(Items) - SizeOf(NativeInt))^ := CurrentLength;
  end;
end;

function TArrayEx<T>.Remove(Item: T): NativeUInt;
var
  i: NativeUInt;
begin
  i := CurrentLength;
  while i <> NativeUInt.MaxValue do
  begin
    if Comparer.Compare(Items[i], Item) = 0 then
    begin
      Delete(i);
      exit(i);
    end;
    Dec(i);
  end;
  Result := NativeUInt.MaxValue;
end;

procedure TArrayEx<T>.Move(CurIndex, NewIndex: NativeUInt);
var
  cT: T;
begin
  if (CurIndex <= CurrentLength) and (NewIndex <= CurrentLength) then
  begin
    cT := Items[CurIndex];
    Items[CurIndex] := Items[NewIndex];
    Items[NewIndex] := cT;
  end;
end;

procedure TArrayEx<T>.Insert(Index: NativeUInt; Item: T);
var
  cT: NativeUInt;
begin
  if Index <= CurrentLength then
  begin
    cT := IndexOf(Item);
    if cT <> NativeUInt.MaxValue then
    begin
      Items[cT] := Items[Index];
      Items[Index] := Item;
    end;
  end;
end;

procedure TArrayEx<T>.QuickSort(var SortList: TArray<T>; L, R: NativeUInt;
  SCompare: TArrayExSortCompareFunc<T>);
var
  i, J: NativeUInt;
  P, c: T;
begin
  if L < R then
  begin
    repeat
      if (R - L) = 1 then
      begin
        if SCompare(SortList[L], SortList[R]) > 0 then
        begin
          c := SortList[L];
          SortList[L] := SortList[R];
          SortList[R] := c;
        end;
        break;
      end;
      i := L;
      J := R;
      P := SortList[(L + R) shr 1];
      repeat
        while SCompare(SortList[i], P) < 0 do
          Inc(i);
        while SCompare(SortList[J], P) > 0 do
          Dec(J);
        if i <= J then
        begin
          if i <> J then
          begin
            c := SortList[i];
            SortList[i] := SortList[J];
            SortList[J] := c;
          end;
          Inc(i);
          Dec(J);
        end;
      until i > J;
      if (J - L) > (R - i) then
      begin
        if i < R then
          QuickSort(SortList, i, R, SCompare);
        R := J;
      end
      else
      begin
        if L < J then
          QuickSort(SortList, L, J, SCompare);
        L := i;
      end;
    until L >= R;
  end;
end;

procedure TArrayEx<T>.Sort(Compare: TArrayExSortCompare<T>);
begin
  QuickSort(Items, 0, CurrentLength - 1,
    function(Item1, Item2: T): Integer
    begin
      Result := Compare(Item1, Item2);
    end);
end;

procedure TArrayEx<T>.SortList(const Compare: TArrayExSortCompareFunc<T>);
begin
  QuickSort(Items, 0, CurrentLength - 1, Compare);
end;

function TArrayEx<T>.First: T;
begin
  Result := Items[0];
end;

function TArrayEx<T>.Last: T;
begin
  Result := Items[CurrentLength];
end;

end.



Появился лишний часик, и я докинул стандартные функции к своему классу


-------------- Тесты в студию!
Проект в архиве с классом.

+
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  windows, System.SysUtils, FastListArray, System.Generics.Collections;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl;
  varargs; external 'msvcrt.dll';

function PrintTime(T: Int64): AnsiString;
var
  A, b: Int64;
begin
  Result := '';
  if QueryPerformanceCounter(A) and QueryPerformanceFrequency(b) then
  begin
    SetLength(Result, 25);
    SetLength(Result, sprintf(PAnsiChar(Result), '%f', single((A - T) / b)));
  end;
end;

procedure Test2;
var
  arr: TList<Integer>;
  i: Integer;
begin
  arr := TList<Integer>.Create;
  with arr do
  begin
    for i := 0 to 50000000 do
      add(i);

    Free;
  end;
end;

procedure Test;
var
  arr: TArrayEx<Integer>;
  i: Integer;
begin
  with arr do
  begin

    init;

    for i := 0 to 50000000 do
      add(i);

    Free;
  end;
end;

procedure Start(func: Pointer);
var
  T: Int64;
type
  call = procedure();
begin
  QueryPerformanceCounter(T);
  call(func)();
  Writeln(PrintTime(T));
end;

begin
  try
    Writeln('TArrayEx:');
    Start(@Test);
    Start(@Test);
    Start(@Test);

    Writeln('TList: ');
    Start(@Test2);
    Start(@Test2);
    Start(@Test2);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Вот такие вот результаты при релизе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
TArrayEx:
0.583250
0.581066
0.617087

TList:
1.576700
1.573458
1.624675



(Обратите внимания, что есть очитка Free иначе бы памяти не хватило)
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39763891
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
64 битный компилятор показал такие результаты
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TArrayEx:
0.822943
0.861437
0.847995
0.840008
0.838371

TList:
1.458338
1.444993
1.435181
1.460552
1.458031



Ну ещё раз 32 битный
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TArrayEx:
0.585735
0.634947
0.584339
0.573577
0.576069

TList:
1.515850
1.532542
1.568213
1.527930
1.541805
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39763893
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39763899
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Хде плагиат?? И рядом не стояло! Медленнее всего на свете

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TList:
Init: 0.000175
Add: 4.711815
Free: 2.340451

TArrayEx:
Init:0.000078
Add:3.064564
Free: 0.144490

TArrayExRgreat:
Add: 10.058781
Free: 0.141493



test code
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  windows, System.SysUtils, FastListArray, System.Generics.Collections, ArrayEx;

function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer; cdecl;
  varargs; external 'msvcrt.dll';

function PrintTime(T: Int64): AnsiString;
var
  A, b: Int64;
begin
  Result := '';
  if QueryPerformanceCounter(A) and QueryPerformanceFrequency(b) then
  begin
    SetLength(Result, 25);
    SetLength(Result, sprintf(PAnsiChar(Result), '%f', single((A - T) / b)));
  end;
end;

procedure Start(func: Pointer);
var
  T: Int64;
type
  call = procedure();
begin
  QueryPerformanceCounter(T);
  call(func)();
  Writeln(PrintTime(T));
end;

const
  N = 250000; //

var
  arr: array [0 .. 1023] of TArrayEx<Integer>;
  arra: array [0 .. 1023] of TList<Integer>;
  arra2: array [0 .. 1023] of TArrayExRgreat<Integer>;
  i, j: Integer;
  T: Int64;

procedure TListTestInit;
begin
  for i := Low(arra) to High(arra) do
    arra[i] := TList<Integer>.Create;
end;

procedure TArrayExTestInit;
begin
  for i := Low(arr) to High(arr) do
    arr[i].init;
end;

procedure TListTestAdd;
begin
  for j := Low(arra) to High(arra) do
    for i := 0 to N do
      arra[j].add(i);
end;

procedure TArrayExTestAdd;
begin
  for j := Low(arr) to High(arr) do
    for i := 0 to N do
      arr[j].add(i);
end;

procedure TArrayExRgreatTestAdd;
begin
  for j := Low(arr) to High(arr) do
    for i := 0 to N do
      arra2[j].add(i);
end;

procedure TListTestFree;
begin
  for j := Low(arra) to High(arra) do
    arra[j].Free;
end;

procedure TArrayExTestFree;
begin
  for j := Low(arr) to High(arr) do
    arr[j].Free;
end;

procedure TArrayExRgreatTestFree;
begin
  for j := Low(arr) to High(arr) do
    arra2[j].Clear;
end;

begin
  try
    Writeln('TList: ');
    Writeln('Init: ');
    Start(@TListTestInit);

    Writeln('Add: ');
    Start(@TListTestAdd);

    Writeln('Free: ');
    Start(@TListTestFree);

    Writeln('TArrayEx: ');
    Writeln('Init: ');
    Start(@TArrayExTestInit);

    Writeln('Add: ');
    Start(@TArrayExTestAdd);

    Writeln('Free: ');
    Start(@TArrayExTestFree);

    Writeln('TArrayExRgreat: ');

    Writeln('Add: ');
    Start(@TArrayExRgreatTestAdd);

    Writeln('Free: ');
    Start(@TArrayExRgreatTestFree);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39763911
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоНа 32 битной платформе доступно 4294967295 записей вместо 2147483647Не верю, что ты сможешь создать свой массив с кол-вом элементов 2147483647 при T=Byte, не говоря о большем. Ты просчитался.

Гирлионайльдо1) Отказ от integer в пользу NativeUInt
1.1) У списка не должно быть отрицательных чисел, включая управляющие процедуры Неюзабельно.
Дальше, в принципе, можно не смотреть.
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39763926
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock Неюзабельно.
Дальше, в принципе, можно не смотреть.[/quot]

Приведи пример, почему это "НеЮзабельно" За то я могу привести целый миллион примеров, как это можно применить

Один из примеров, больше не надо делать проверку на отрицание/

Что? Скажешь ты мне.

А вот -
Код: pascal
1.
if (CurIndex <= CurrentLength) and (NewIndex <= CurrentLength) then



А было бы это вот так
Код: pascal
1.
if ((CurIndex >= 0) and (CurIndex <= CurrentLength)) and ((NewIndex >= 0) and (NewIndex <= CurrentLength)) then



Капец как не юзабельно!

- Насчёт памяти, 2 гб не предел!. Через SetPEFlags можно установить до 4 гб. По этому то я и сделал Cardinal по умолчанию
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39763943
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

В код лезть самому смотреть только за этим пока не хочется, но что таки означает п.2 - "у списка не должно быть отрицательных чисел"?
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39763983
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

повторюсь: нет нотификации. если не знаешь что это, то вот пример для удаления:

procedure TList.Delete(Index: Integer);
if (Temp <> nil) and (ClassType <> TList) then
Notify(Temp, lnDeleted);
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764204
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С управляемыми типами работать не будет.
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764274
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Работает.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
type
  addTest = TArray<TArrayEx<String>>;
  ArrTest = TArrayEx<addTest>;
  ArrTest1 = TArray<ArrTest>;

var
  arr: ArrTest1;

procedure Test;
var
  I, c, k: Integer;
  v: ArrTest;
  lines: ^addTest;
begin
  SetLength(arr, RandomRange(10, 20));
  for I := Low(arr) to High(arr) do
  begin
    arr[I].init;

    new(lines);
    SetLength(lines^, RandomRange(10, 20));
    for c := Low(lines^) to High(lines^) do
    begin
      lines^[c].init;
      for k := 0 to RandomRange(10, 20) do
        lines^[c].add(IntToStr(I) + ') ' + RandomStr(Random(10)));
    end;

    arr[I].add(lines^);

  end;
end;

...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764277
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

А хде она есть?))) И зачем???))) Для какой балды
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764282
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad FГирлионайльдо,

В код лезть самому смотреть только за этим пока не хочется, но что таки означает п.2 - "у списка не должно быть отрицательных чисел"?

Это когда ты пишешь
Код: pascal
1.
 tlist.delete(-5);



И в работе кода, тебя предупреждение по попке нежно бьёт ремнём, и говорит что так низзяя

А если сделать UInt то отрицательных значений не будет. И компилятор на стадии компиляции скажет
- E1012 Constant expression violates subrange bounds
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764286
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоРаботает.
Лучше тестируй.
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764292
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Строки не теряются. Я уже сделал многомерный массив из много вложений управляемыми типами. И на конце всё доходит, и освобождается.

Не знаю, не знаю. Моя фантазия закончилась, где бы она мне пинок под зад дала
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764299
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764302
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764316
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё, Няшик нифига не палиццццо
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764327
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдоrgreat,

Хде плагиат?? И рядом не стояло! Медленнее всего на свете

У тебя в тесте мой древний код. Еще без оптимизации.

автор x32:
TList:
Add: 2.704769
Free: 1.291943
TArrayEx:
Add: 1.826981
Free: 0.107918
TArrayExRgreat:
Add: 2.458227
Free: 0.101365

x64:
TList:
Add: 2.367541
Free: 1.489371
TArrayEx:
Add: 2.778226
Free: 0.174325
TArrayExRgreat:
Add: 2.000243
Free: 0.105490

Ну и функционала у меня в разы больше. :)
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764328
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоVlad FГирлионайльдо,

В код лезть самому смотреть только за этим пока не хочется, но что таки означает п.2 - "у списка не должно быть отрицательных чисел"?
Это когда ты пишешь
tlist.delete(-5);
И в работе кода, тебя предупреждение по попке нежно бьёт ремнём, и говорит что так низзяя
А если сделать UInt то отрицательных значений не будет. И компилятор на стадии компиляции скажет- E1012 Constant expression violates subrange bounds
Т.е. вместо "чисел" и "значений" ты хотел сказать "индексов"? И второй раз не смог??
Так нельзя. Априори подрываешь доверие к плодам рук своих.))
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764332
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдоmakhaon,

А хде она есть?))) И зачем???))) Для какой балды


Ну ты хоть исходники Delphi смотрел? Перед тем, как их править?
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764367
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Похоже проблема в SysReallocMem. Посмотрю чем эту функцию заменить.

rgreat,

Как так выходит, что у меня на пк твоя функция на 7 секунд медленнее ?




Vlad FТак нельзя. Априори подрываешь доверие к плодам рук своих.))

Стереотипы должны умереть.
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764368
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоКак так выходит, что у меня на пк твоя функция на 7 секунд медленнее ?
.Optimisation=False?
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764378
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоПохоже проблема в SysReallocMem. Посмотрю чем эту функцию заменить.
Проблема в том, что выделяемая память не очищается, что для размещения данных управляемых типов делать необходимо.
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764385
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоСтереотипы должны умереть.
А чего у тебя метод Insert делает?
...
Рейтинг: 0 / 0
Быстрый список TArrayEx
    #39764394
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatГирлионайльдоКак так выходит, что у меня на пк твоя функция на 7 секунд медленнее ?
.Optimisation=False?

Я релизе всегда она включена.

Не может быть такого в приоре, что бы его код был быстрее. Он же за каждый add дёргает увеличение через SetLength

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function TArrayExRgreat<T>.Add(Value: T): integer;
begin
  Result:=Length(Items);
  System.SetLength(Items,Result+1);
  Items[Result]:=Value;

  SetIndex(Result,Value);
end;



Kazantsev AlexeyПроблема в том, что выделяемая память не очищается, что для размещения данных управляемых типов делать необходимо.


Я вижу что SysReallocMem вернула выделенную память на муссор. (Скорее используемую память)

... А Insert заменяет Найденный элемент в текущий индекс
Код: pascal
1.
procedure Insert(Index: NativeUInt; Item: T);
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрый список TArrayEx
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]