eine recht billige Variante ist mit einem Interface implementierbar - allerdings muss dann jede Methode, die gemessen werden soll, mit einer Zeile instrumentiert werden. Ich zeige hier mal ein kurzes Beispiel (aus dem Kopf runtergetippelt)
Delphi-Quellcode:
type
IAutoDestroy = interface(IInterface)
end;
TMeasure = class(TInterfacedObject, IAutoDestroy)
protected
FMessage: string;
procedure Log(const msg: string);
public
class function MeasureThis(const msg: string): IAutoDestroy
constructor Create(const msg: string); reintroduce;
destructor Destroy; override;
end;
// ...
class function TMeasure.MeasureThis(const msg: string): IAutoDestroy
begin
Result := TMeasure.Create(msg);
end;
constructor TMeasure.Create(const msg: string);
begin
inherited Create;
// Log msg
FMessage := msg;
Log('Beginn: ' + FMessage);
end;
destructor TMeasure.Destroy();
Log('Ende: ' + FMessage);
end;
procedure TMeasure.Log(const msg: string);
begin
Writeln(FormatDateTime('HH:MM:SS', Now), ' [', GetCurrentThreadId(), '] ', msg);
end;
Die Verwendung ist dann so:
Delphi-Quellcode:
procedure TForm.ButtonClick(...)
begin
TMeasure.MeasureThis('TForm.ButtonClick');
Writeln('Muuh');
Sleep(1000);
end;
die Ausgabe ist dann etwa so:
Code:
11:12:00 [123] Beginn: TForm.ButtonClick
Muuh
11:12:01 [123] Ende: TForm.ButtonClick
Das lässt sich natürlich noch beliebig verfeinern