<div dir="ltr"><div class="gmail_default" style="font-family:'courier new',monospace">Hi All,</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace">I am programming a Bloom Filter and need a high-performance way to allocate and wipe large block of memory.  I did the following test:</div><div class="gmail_default" style="font-family:'courier new',monospace"><br></div><div class="gmail_default" style="font-family:'courier new',monospace"><div class="gmail_default">program getmem;</div><div class="gmail_default">{$mode objfpc}{$H+}</div><div class="gmail_default">uses epiktimer;</div><div class="gmail_default">const</div><div class="gmail_default">  SIZE = 1024 * 1024 * 1024;</div><div class="gmail_default">  CNT = 10;</div><div class="gmail_default">var</div><div class="gmail_default">  a: array of Byte;</div><div class="gmail_default">  p: Pointer;</div><div class="gmail_default">  et: TEpikTimer;</div><div class="gmail_default">  i: Integer;</div><div class="gmail_default">  t1, t2: TimerData;</div><div class="gmail_default">begin</div><div class="gmail_default">  et := TEpikTimer.Create(nil);</div><div class="gmail_default">  et.Clear(t1); et.Clear(t2);</div><div class="gmail_default">  for i := 1 to CNT do begin</div><div class="gmail_default">    et.Start(t1);</div><div class="gmail_default">    p := GetMemory(SIZE);</div><div class="gmail_default">//    SetLength(a, SIZE);</div><div class="gmail_default">    et.Stop(t1);</div><div class="gmail_default">    et.Start(t2);</div><div class="gmail_default">    FillQWord(p^, SIZE div 8, 0);</div><div class="gmail_default">//    FillQWord(a[0], SIZE div 8, 0);</div><div class="gmail_default">    et.Stop(t2);</div><div class="gmail_default">    FreeMem(p);</div><div class="gmail_default">//    a := nil;</div><div class="gmail_default">  end;</div><div class="gmail_default">  WriteLn('Alloc: ', et.Elapsed(t1) / CNT);</div><div class="gmail_default">  WriteLn('Clear: ', et.Elapsed(t2) / CNT);</div><div class="gmail_default">end.</div><div class="gmail_default"><br></div><div class="gmail_default">The result is:</div><div class="gmail_default"><br></div><div class="gmail_default">Using GetMemory:</div><div class="gmail_default"><div class="gmail_default"><br></div><div class="gmail_default">Alloc:  9.4078169999999997E-0001</div><div class="gmail_default">Clear:  2.1342020000000002E-0001</div><div><br></div></div><div class="gmail_default"><div class="gmail_default">Using SetLength:</div><div class="gmail_default"><br></div><div class="gmail_default">Alloc:  2.8100000000000000E-0005</div><div class="gmail_default">Clear:  7.7497550000000004E-0001</div><div class="gmail_default"><br></div><div class="gmail_default">It is understandable that GetMemory() is faster than SetLength(), but why the difference in FillQWord()?</div><div class="gmail_default"><br></div><div class="gmail_default">Also, I usually use pointer to pass block of memory to functions.  How do I implement a function with the following signature:</div><div class="gmail_default"><br></div><div class="gmail_default">procedure MyProc(var Buf; Len: Integer):</div><div class="gmail_default"><br></div><div class="gmail_default">I mean, how to handle "var Buf" inside the procedure body?</div><div class="gmail_default"><br></div><div class="gmail_default">Thanks!</div><div class="gmail_default"><br></div><div class="gmail_default">Xiangrong</div></div></div></div>