가변 크기의 데이터 블록 (고정 된 크기의 헤더와 데이터 양의 변화)을 허용하는 델파이 6에서 루틴을 보내고 루틴은 결국 Winsock에서 sendto()를 호출합니다. 저는 전달 된 블록이 var (오해의 소지가 있지만 다소 효과가있는)이고 한 번 블록에 대한 포인터가 전달 된 두 가지 방법으로 코딩했습니다. 벤치마킹에 사용되는 간단한 버전은 같은 같습니다델파이 프로 시저 매개 변수 : var이 포인터보다 느립니다?
type
header = record destination, serialnumber: integer end;
pheader = ^header;
var
smallblock: record h: header; data: array[1..5] of integer end;
bigblock: record h: header; data: array[1..100] of integer end;
procedure send1(var h: header; size: integer);
begin
h.destination := 1; // typical header adjustments before sendto()
h.serialnumber := 2;
sendto(sock, h, size, 0, client, sizeof(client))
end;
procedure send2(p: pheader; size: cardinal);
begin
p^.destination := 1;
p^.serialnumber := 2;
sendto(sock, p^, size, 0, client, sizeof(client))
end;
procedure doit1;
begin
send1(smallblock.h, sizeof(smallblock));
send1(bigblock.h, sizeof(bigblock));
end;
procedure doit2;
begin
send2(@smallblock, sizeof(smallblock));
send2(@bigblock, sizeof(bigblock));
end;
은 "보내기"루틴이 많은 다른 블록 크기로 종종 호출됩니다, 그리고 가능한 한 빨리해야한다. 몇 가지 간단한 벤치 마크를 수행 한 후 (gettickcount를 호출하여 타이밍을 지정 함) 포인터 기술 (doit2)은 내 시스템에서 var 기술 (doit1)보다 약 3 % 빠릅니다. 실제 차이는 보이지 않지만 오브젝트 코드의 두 기술 사이 (나는 어셈블러 전문가는 아니다).
내 원유 벤치 마크로 인한 3 %의 환상인가, 포인터 기술이 실제로 var 기술을 능가합니까?
@mikey : 아니, 없다. :-) 레미의 답변에서 내 대답을 참조하십시오. –
3 %는 엄청난 차이입니다. 벤치 마크를 확인하십시오. – Vector