지난 번 포스트에서 "인터페이스 릴레이"라는 주제를 다룬 적이 있습니다. 특정 객체가 다른 객체의 메소드를 위임 받아 실행하기 때문에 메소드가 다른 메소드를 호출하고 리턴을 돌려주는 일만 담당하는 경우가 되겠습니다.
이러한 경우 최대한 메소드 호출 시간을 절약하기 위해서 다음과 같이 뻘짓을 해봤습니다 ^^;
1억번 반복에 약 500 ms를 절약 할 수 있었습니다. 테스트 환경은 인텔 듀얼 코어 2.6GHz 노트북입니다.
[소스]
unit _fmMain;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TFirstTest = class (TComponent)
private
FNO : integer;
public
procedure DoSomething;
published
property No : integer read FNo;
end;
TSecondTest = class
private
FTest : TFirstTest;
public
constructor Create;
destructor Destroy; override;
procedure DoSomething;
end;
TThirdTest = class
private
FTest : TFirstTest;
public
constructor Create;
destructor Destroy; override;
var DoSomething : procedure of object;
end;
TfmMain = class(TForm)
btTest: TButton;
procedure btTestClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FFirstTest : TFirstTest;
FSecondTest : TSecondTest;
FThirdTest : TThirdTest;
public
end;
var
fmMain: TfmMain;
implementation
uses
MMTimer;
{ TFirstTest }
procedure TFirstTest.DoSomething;
begin
FNo := FNo + 1;
end;
{ TSecondTest }
constructor TSecondTest.Create;
begin
inherited;
FTest := TFirstTest.Create(nil);
end;
destructor TSecondTest.Destroy;
begin
FreeAndNil(FTest);
inherited;
end;
procedure TSecondTest.DoSomething;
begin
FTest.DoSomething;
end;
{ TThirdTest }
constructor TThirdTest.Create;
begin
inherited;
FTest := TFirstTest.Create(nil);
DoSomething := FTest.DoSomething;
end;
destructor TThirdTest.Destroy;
begin
FreeAndNil(FTest);
inherited;
end;
{$R *.dfm}
procedure TfmMain.btTestClick(Sender: TObject);
var
Loop1: Integer;
Loop2: Integer;
Tick : DWord;
begin
Tick := MMGetTickCount;
for Loop1 := 1 to 10000 do
// for Loop2 := 1 to 10000 do FTest.DoSomething; // 559 ms
// for Loop2 := 1 to 10000 do FSecondTest.DoSomething; // 829 ms
for Loop2 := 1 to 10000 do FThirdTest.DoSomething; // 580 ms
Caption := IntToStr(MMGetTickCount - Tick);
end;
procedure TfmMain.FormCreate(Sender: TObject);
begin
MMInitialize;
FFirstTest := TFirstTest.Create(nil);
FSecondTest := TSecondTest.Create;
FThirdTest := TThirdTest.Create;
end;
end.
| Delphi Indy UDP Socket의 패킷 손실률 (0) | 2012.07.18 |
|---|---|
| TCriticalSection vs TMultiReadExclusiveWriteSynchronizer (0) | 2012.07.17 |
| 64비트에서 WSAAccept 오동작 문제 (0) | 2012.06.29 |
| Same origin policy 때문에 다른 포트로 jQuery에서 get이나 post를 할 수 없을 때 (0) | 2012.05.22 |
| Record vs Object (0) | 2012.04.27 |