если вся эта контрольно-отслеживетельная программа будет работать помоему она будет заметно тормозить тестируемую программу и результаты не будут верны
Нет, с результатами-то все нормально будет. Ставим приоритет у создаваемого процесса RealTime, закрываем всякие антивирусы Касперского 

 . Автоматические тестирующие системы используют на олимпиадах по информатике высокого уровня, проблем никаких (правда, как их пишут?). И к тому же, с учетом специфики тестирующей системы, можно на задачу времени дать с небольшим запасом, чтобы к системе претензий не было.
Я вот нашел на 
http://forum.sources.ru/index.php?showtopic=94309 некоторую информацию. Ситуация у меня такая, что я работаю в виндовском Лазарусе  из под вайна (кстати, при этом наблюдаются некоторые баги). Это - чтобы не мучаться с переносом потом на винду, да и смело использовать WinAPI. 
Вот пример с 
http://forum.sources.ru/index.php?showtopic=94309 от oleg_v:
var
  ProcMemCount : PROCESS_MEMORY_COUNTERS;
  ProcessID : Cardinal;
  hCurrWindow : HWND; 
  hProcess : THandle;
  
begin
  hCurrWindow := GetForegroundWindow;// берем хендл активного окна
  GetWindowThreadProcessId(hCurrWindow,@ProcessID);// достаем ID процесса по хендлу окна
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID); //по текущему ID процесса получаем хендл на процесс
  GetProcessMemoryInfo(hProcess,@ProcMemCount,SizeOf(ProcMemCount)); // в ProcMemCount получаем счетчики памяти
// такие же значения показывает Task manager в Windows
//ProcMemCount.PageFaultCount          - Кол-во ошибочных обращений к странице памяти
//ProcMemCount.PeakWorkingSetSize/1024         - Пиковое исп. памяти, Кб
//ProcMemCount.WorkingSetSize/1024             - Текущее исп. памяти, Кб
//ProcMemCount.QuotaPeakPagedPoolUsage/1024    -  Пиковый выгружаемый пул, Кб
//ProcMemCount.QuotaPagedPoolUsage/1024        - Текущий выгружаемый пул, Кб
//ProcMemCount.QuotaPeakNonPagedPoolUsage/1024 - Пиковый невыгружаемый пул, Кб
//ProcMemCount.QuotaNonPagedPoolUsage/1024     - Текущий невыгружаемый пул, Кб
//ProcMemCount.PagefileUsage/1024              - Текущее исп. файла подкачки, Кб
//ProcMemCount.PeakPagefileUsage/1024          - Пиковое исп. файла подкачки, Кб
  CloseHandle(hProcess);
end;
Во первых, в Лазарусе функции GetProcessMemoryInfo второй аргумент передается по ссылке, а не как в примере, где передается адрес.
Я решил, для надежности, вызвать функцию GetProcessMemoryInfo так: у меня есть Process1: TProcess, запускаю через него, например, блокнот (c:\windows\notepad.exe) по нажатию на первую кнопочку. По нажатии на вторую кнопку:
procedure TForm1.Button2Click(Sender: TObject);
var ProcMemCount : PROCESS_MEMORY_COUNTERS;
begin
  if not GetProcessMemoryInfo(Process1.Handle,ProcMemCount,SizeOf(ProcMemCount)) then
    showmessage('Something is not good...');
  Label1.Caption:=inttostr(ProcMemCount.PeakWorkingSetSize{GetProcessMemory});
end;
То есть первый аргумент  GetProcessMemoryInfo - уже известный хендл процесса, запущенного через Process1 .
В итоге, в Label1 у меня 0. Кстати, все поля ProcMemCount после вызова GetProcessMemoryInfo становятся нулевыми, кроме CB=40.
Возможно, виноват WINE. На 
http://forum.sources.ru/index.php?showtopic=94309 пишут, что GetProcessMemoryInfo не работает под Windows98. Но вроде-бы Вайн эмулирует XP. У меня, по крайней мере так в настройках 

.
Итак, может кто-нибудь что-либо подскажет?