Вверх ↑
Разработчик
Ответов: 26160
Рейтинг: 2127
#1: 2012-04-10 14:04:11 ЛС | профиль | цитата
[offtop]
iarspider писал(а):
ты частенько (La)TeX-ом пользуешься -- оттуда и привычка "--" набирать

Это из Ворда пошло, там есть автозамена двух дефисов на одно тире[/offtop]
------------ Дoбавленo в 14.04:
Вот. Попробовал накоропать табличный (не цепочный) кластерный массив на IC. По тестам немного уступает динамическому массиву такого же типа. Но это чисто отработка алгоритма


Add(MainForm,2953706,98,126)
{
}
Add(InlineCode,6775550,308,126)
{
@Hint=#12:ClasterArray|
WorkPoints=#7:doItems|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|5:const|24: ArrClasterSize = 1024;|0:|5:type |22: PInteger = ^Integer;|21: ArrType = integer;|26: PClastArr = ^TClastArr; |63: TClastArr = packed array[0..ArrClasterSize - 1] of ArrType; |0:|4:type|25: TClasterArray = class; |32: PClasterArray = TClasterArray;|31: TClasterArray = class(TDebug)|24: FListPoint: PList;|30: FLength, FHigh: integer;|11: private|44: function GetEx(Idx: Integer): ArrType;|62: procedure PutEx(Idx: Integer; const Value: ArrType); |42: procedure SetLength(Value: integer);|22: procedure Clear;|10: public|35: destructor Destroy; override;|5: |67: property Items[Idx: Integer]: ArrType read GetEx write PutEx;|60: property Length: integer read FLength write SetLength;|40: property High: integer read FHigh;|4:end;|0:|40:function NewClasterArray: PClasterArray;|0:|80://******************************************************************************|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|31: ClasterArr: PClasterArray;|9: public|25: onResult: THI_Event;|24: constructor Create;|34: destructor Destroy; override;|51: procedure doItems(var Data:TData; Index:word);|5: end;|0:|14:implementation|0:|40:function NewClasterArray: PClasterArray;|5:begin|33: Result := PClasterArray.Create;|31: Result.FListPoint := NewList;|22: Result.FLength := 0;|4:end;|0:|33:destructor TClasterArray.Destroy;|3:var|13: i: integer;|5:begin|39: for i := 0 to FListPoint.Count - 1 do|44: dispose(PClastArr(FListPoint.Items[i]));|20: FListPoint.free; |12: inherited;|4:end;|0:|52:function TClasterArray.GetEx(Idx: Integer): ArrType;|3:var|23: block, elem: integer;|5:begin|15: Result := -1;|33: if Idx > FLength - 1 then exit;|34: block := Idx div ArrClasterSize;|34: elem := Idx mod ArrClasterSize; |53: Result := PClastArr(FListPoint.Items[block])[elem];|4:end;|0:|66:procedure TClasterArray.PutEx(Idx: Integer; const Value: ArrType);|3:var|23: block, elem: integer;|5:begin|33: if Idx > FLength - 1 then exit;|34: block := Idx div ArrClasterSize;|34: elem := Idx mod ArrClasterSize; |52: PClastArr(FListPoint.Items[block])[elem] := Value;|4:end;|0:|30:procedure TClasterArray.Clear;|3:var|13: i: integer;|5:begin|39: for i := 0 to FListPoint.Count - 1 do|44: dispose(PClastArr(FListPoint.Items[i]));|21: FListPoint.Clear; |4:end;|0:|34:procedure TClasterArray.SetLength;|3:var|18: CArr: PClastArr;|20: i, block: integer;|5:begin|19: if Value = 0 then|9: Clear|8: else |7: begin|38: block := Value div ArrClasterSize;|40: if block < FListPoint.Count - 1 then|9: begin|51: for i := block + 1 to FListPoint.Count - 1 do|48: dispose(PClastArr(FListPoint.Items[i]));|66: FListPoint.DeleteRange(block + 1, FListPoint.Count - block);|7: end|45: else if block > FListPoint.Count - 1 then|47: for i := 0 to block - FListPoint.Count do|11: begin|18: new(CArr);|44: FillChar(CArr^, ArrClasterSize, #0);|38: FListPoint.Add(Pointer(CArr));|14: end; |6: end;|19: FLength := Value;|23: FHigh := Value - 1; |4:end;|0:|80://******************************************************************************|0:|31:constructor THiAsmClass.Create;|5:begin|12: inherited;|34: ClasterArr := NewClasterArray; |4:end;|0:|31:destructor THiAsmClass.Destroy;|5:begin|18: ClasterArr.free;|12: inherited;|6:end; |0:|30:procedure THiAsmClass.doItems;|3:var|16: i, j: integer;|5:begin|24: for i := 0 to 2099 do |7: begin|27: ClasterArr.Length := i;|36: for j := 0 to ClasterArr.High do|31: ClasterArr.Items[j] := j;|36: for j := 0 to ClasterArr.High do|49: _hi_onEvent(onResult, ClasterArr.Items[i]);|8: end; |4:end;|0:|4:end.|
AddHint(53,-29,71,13,@Hint)
}
Add(InlineCode,15174344,308,217)
{
@Hint=#12:DynamicArray|
WorkPoints=#7:doItems|
EventPoints=#8:onResult|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,kol,Share,Debug;|0:|5:type |21: ArrType = integer;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|27: Arr: array of ArrType;|9: public|25: onResult: THI_Event;|51: procedure doItems(var Data:TData; Index:word);|5: end;|0:|14:implementation|0:|30:procedure THiAsmClass.doItems;|3:var|16: i, j: integer;|5:begin|24: for i := 0 to 2099 do |7: begin|22: SetLength(Arr, i);|30: for j := 0 to High(Arr) do|18: Arr[j] := j;|30: for j := 0 to High(Arr) do|36: _hi_onEvent(onResult, Arr[i]);|8: end; |4:end;|0:|4:end.|
AddHint(57,-20,80,13,@Hint)
}
Add(Label,9310781,308,168)
{
Left=95
Top=15
Height=17
}
Add(Label,9307311,98,84)
{
Left=15
Top=15
Width=63
Height=17
Caption="ClasterArray:"
}
Add(Label,552797,308,259)
{
Left=95
Top=40
Height=17
}
Add(Label,6667527,91,77)
{
Left=15
Top=40
Width=72
Height=17
Caption="DynamicArray:"
}
Add(TimeCounter,8168703,245,126)
{
link(onStart,6775550:doItems,[])
link(onStop,9310781:doText,[(293,139)(293,174)])
}
Add(Hub,12900450,203,126)
{
OutCount=4
link(onEvent1,8168703:doStart,[])
link(onEvent2,8168703:doStop,[])
link(onEvent3,15466341:doStart,[(231,146)(231,223)])
link(onEvent4,15466341:doStop,[(227,153)(227,230)])
}
Add(TimeCounter,15466341,245,217)
{
link(onStart,15174344:doItems,[])
link(onStop,552797:doText,[(293,230)(293,265)])
}
Add(Button,12697595,147,126)
{
Left=145
Top=70
TabOrder=-1
link(onClick,12900450:doEvent1,[])
}

У меня следующий результат в msec:

ClasterArray -- 105
DynamicArray -- 87

Алгоритм теста построен на динамическом создании, полной записи и полного чтениия, в каждой итерации, массива с длиной на один элемент больше предыдущего
карма: 22

0