<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
The dynamic arrays in Lazarus have so many terrific properties. Giving power users the ability to not initialize them would give clear performance benefits. This is useful in real world sitautions where one has long term arrays, but also can use transient arrays
 of the same type. Another feature that could help power users is the ability to set the alignment of setlength() - see issue 0034031. From my view, dynamic arrays are one of the features that makes Pascal code so much nicer than C. Web searches for "Speed
 "problem" with SetLength” and "Faster way of initializing arrays in Delphi” suggest others encounter these issues as well. I would advocate for a couple of advanced and optional features (alignment and initialization control) would allow this elegant property
 of Pascal to scale into these niches. It certainly makes code moree readable and consistent to keep one type of structure, rather than having to switch to GetMem for doing some tasks (SIMD, GPU, transient large arrays). Giving users control can obviously deviate
 from guaranteed behavior (e.g. one could choose a poor alignment, or not initialize strong arrays and leave random data in elements). However, allowing advanced users to elect to use these features would really help dynamic arrays scale to problems we face
 in the real world.<br class="">
<br class="">
Despite these preferences, the experiment below shows that even for very large arrays, the initialization penalty may not be big so long as long you fill the array immediately after setting the length of the array. Note that SetLength() is very slow, but the
 subsequent filling of the array is fast (presumably due to cache), while getmem returns quickly, but the intiailization is substantially slower. I would be grateful if anyone can suggest any issues here or any method to accelerate either set of routines.
<div class=""><br class="">
</div>
<div class="">
<div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Menlo;" class="">
<span style="font-variant-ligatures: no-common-ligatures" class="">Milliseconds SetLength: 214..221 mean 218</span></div>
<div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Menlo;" class="">
<span style="font-variant-ligatures: no-common-ligatures" class="">Milliseconds fill array: 56..103 mean 95</span></div>
<div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Menlo;" class="">
<span style="font-variant-ligatures: no-common-ligatures" class="">Milliseconds GetMem: 0..0 mean 0</span></div>
<div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Menlo;" class="">
<span style="font-variant-ligatures: no-common-ligatures" class="">Milliseconds fill array: 251..270 mean 259</span></div>
</div>
<div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Menlo;" class="">
<span style="font-variant-ligatures: no-common-ligatures" class=""><br class="">
</span></div>
<div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Menlo;" class="">
<span style="font-variant-ligatures: no-common-ligatures" class="">--------------------</span></div>
<div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Menlo;" class="">
<span style="font-variant-ligatures: no-common-ligatures" class=""><br class="">
</span></div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; font-size: 12px;" class=""><font face="Menlo" class="">
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">program test3;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">//fpc -O3 test3.pas; ./test3</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">{$IFDEF FPC}{$mode delphi} {$H+}{$ENDIF}     </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><br class="">
</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">  uses Math, SysUtils,DateUtils;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><br class="">
</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">type</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> TUInt32s = array of uint32; </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> TInt32s = array of int32; </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> TRGBA = packed record //red,green,blue,alpha</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">   R,G,B,A : byte;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> end;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> TRGBAs = array of TRGBA;  </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> TRGBA0 = array [0..MAXINT] of TRGBA; </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> TRGBAp = ^TRGBA0; //pointer to RGBA array</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> TUInt320 = array [0..MAXINT] of uint32; </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""> TUInt32p = ^TUInt320; //pointer to RGBA array</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><br class="">
</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><br class="">
</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">procedure SetLengthP(var S: TRGBAp; Len: SizeInt); overload;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">begin</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>ReAllocMem(S, Len *sizeof(TRGBA));</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">end;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><br class="">
</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">procedure setlengthTest();</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">const</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>nVox = (512 * 512 * 512); //typical CT scan as RGBA array</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>nTest = 10;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">var</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>startTime: TDateTime;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>i, j, ms, mn,mx,tot, mn2, mx2, tot2: int64;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>ArrayDyn: TRGBAs;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>Arrayp: TRGBAp;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>asUint32s: TUInt32s;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>asUint32p: TUInt32p;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">begin</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>//setlength() is slow, presumably because it intializes array (fillchar())</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>//<a href="https://alt.comp.lang.borland-delphi.narkive.com/O0jRrNgS/speed-problem-with-setlength" class="">https://alt.comp.lang.borland-delphi.narkive.com/O0jRrNgS/speed-problem-with-setlength</a></div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>//test setlength</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mn := maxint;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mx := 0;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>tot :=  0;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mn2 := maxint;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mx2 := 0;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>tot2 :=  0;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>for i := 1 to nTest do begin</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>startTime := Now;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>SetLength(ArrayDyn, nVox);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>ms := MilliSecondsBetween(Now,startTime);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mn := min(ms,mn);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mx := max(ms,mx);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>tot += ms;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>//fill arrays</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>startTime := Now;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>asUint32s := TUInt32s(ArrayDyn); </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>for j := 0 to nVox-1 do</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>asUint32s[j] := (j ); </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>SetLength(ArrayDyn,0);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>ms := MilliSecondsBetween(Now,startTime);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mn2 := min(ms,mn2);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mx2 := max(ms,mx2);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>tot2 += ms;<span class="Apple-tab-span" style="white-space:pre">
</span></div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>end;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>writeln(format('Milliseconds SetLength: %d..%d mean %d', [mn,mx, round(tot/nTest)]));</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>writeln(format('Milliseconds fill array: %d..%d mean %d', [mn2,mx2, round(tot2/nTest)]));</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>//test GetMem</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mn := maxint;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mx := 0;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>tot :=  0;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mn2 := maxint;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mx2 := 0;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>tot2 :=  0;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>Arrayp := nil; //must initialize!</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>for i := 1 to nTest do begin</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>startTime := Now;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>SetLengthP(Arrayp, nVox);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>ms := MilliSecondsBetween(Now,startTime);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mn := min(ms,mn);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mx := max(ms,mx);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>tot += ms;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>//fill arrays </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>startTime := Now;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>{$IFDEF X}</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>asUint32s := TUInt32s(Arrayp);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>for j := 0 to nVox-1 do</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>asUint32s[j] := (j );</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>{$ELSE} </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>asUint32p := TUInt32p(Arrayp); </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>for j := 0 to nVox-1 do</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>asUint32p[j] := (j );</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>{$ENDIF} </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>SetLengthP(Arrayp,0);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>ms := MilliSecondsBetween(Now,startTime);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mn2 := min(ms,mn2);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>mx2 := max(ms,mx2);</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>tot2 += ms;<span class="Apple-tab-span" style="white-space:pre">
</span></div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>end;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>writeln(format('Milliseconds GetMem: %d..%d mean %d', [mn,mx, round(tot/nTest)]));<span class="Apple-tab-span" style="white-space:pre">
</span></div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>writeln(format('Milliseconds fill array: %d..%d mean %d', [mn2,mx2, round(tot2/nTest)]));</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">end;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">  </div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">begin</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class=""><span class="Apple-tab-span" style="white-space:pre"></span>setlengthTest();</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">    Exit;</div>
<div style="margin: 0px; font-stretch: normal; line-height: normal;" class="">end.</div>
</font></span></div>
<div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; font-family: Menlo;" class="">
<span style="font-variant-ligatures: no-common-ligatures" class=""><br class="">
</span></div>
</body>
</html>