Programımız hafızada kaç KB yer kaplıyor ?

// 16 Mayıs 2009 // Delphi, Programlama

Yazdığımız programların hafızada ne kadar yer kapladıkları bilgisini elde etmenin pek çok yolu olmasına rağmen sanırım en iyi yöntem PSAPI.DLL içindeki metodları kullanmak. Bizim sevgili Delphi’miz sağolsun bu DLL’in içindeki metodları psAPI.pas(WinNT process API Interface Unit) içinde deklere etmiş. Bizlere sadece kullanmak kalıyor. Unit’i incelediğimizde pek çok yararlı metodun tanımlı olduğunu gözlemleyebiliyoruz. Processleri listeleyenlerinden tutunda, makinanızdaki device driverları listeleyen yada programınızın gereksiz kullandığı hafıza bloklarını serbest bırakmaya yarayacak bir diğer metod olan EmptyWorkingSet‘e kadar pek çok yararlı metod mevcut.(Bknz.)

Biz bu metodlardan GetProcessMemoryInfo isimli metodu kullanacağız makalemizde. Bu metod psAPI.pas’da aşağıdaki şekilde tanımlanmıştır:

function GetProcessMemoryInfo(Process: THandle;
  ppsmemCounters: PPROCESS_MEMORY_COUNTERS; cb: DWORD): BOOL;


Yukarıdaki tanıma sahip olan GetProcessMemoryInfo isimli fonksiyon belirtilen process için TProcessMemoryCounters tipli record değişkeninin içini doldurmaktadır. TProcessMemoryCounters’ın tanımlanma şekline sizlerin psAPI.pas içinden bakabileceğini ümid ederek, kısa kodumuzu yazmaya başlayalım:

function MemorySize: Cardinal;
var
  pMemCounter: TProcessMemoryCounters;
begin
  pMemCounter.cb := SizeOf(TProcessMemoryCounters) ;

  if GetProcessMemoryInfo(GetCurrentProcess, @pMemCounter, SizeOf(TProcessMemoryCounters)) 
  then Result := pMemCounter.WorkingSetSize
  else raise Exception.Create('Bir sorun oldu..');
end;

Yukarıdaki fonksiyon bize uygulamamızın Task Manager’da da görülebildiği gibi byte cinsinden ne kadar hafıza kullandığını gösterecektir. Sizler geri dönen değeri 1024′e bölerek KB’ı, onu da 1024′e bölerek MB’ı bulabilirsiniz. Fonksiyonumuza küçük bir demo ile hayat vererek makelemizi tamamlayalım;

// Timer1 TTimer türünde Interval 1000
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Caption := 'Kullanılan Memory:' + FormatFloat('#,##', MemorySize / 1024) + ' KB.';
end;

Saygılar, sevgiler..

Yorum Yazın