2013-04-18 4 views
0

가변 크기의 데이터 블록 (고정 된 크기의 헤더와 데이터 양의 변화)을 허용하는 델파이 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 기술을 능가합니까?

+0

@mikey : 아니, 없다. :-) 레미의 답변에서 내 대답을 참조하십시오. –

+0

3 %는 엄청난 차이입니다. 벤치 마크를 확인하십시오. – Vector

답변

7

포인터 매개 변수 대 var 매개 변수를 전달할 때 성능 차이는 없습니다. 그들은 똑같은 일 (메모리 주소 전달)을하고, 동일하지는 않은 어셈블리 코드로 컴파일합니다. 따라서 벤치마킹 차이는 벤치마킹 자체의 문제가 아니라 벤치 마크중인 코드의 문제로 인해 발생할 수 있습니다. 예를 들어 GetTickCount()은 최상의 벤치마킹 도구는 아닙니다. 코드 시간을 측정하는 가장 좋은 방법은 AQTime과 같은 외부 프로파일 러를 사용하는 것입니다.

BTW, 당신의 doit2() 시험이 대신 같아야합니다

procedure doit2; 
begin 
    send2(@(smallblock.h), sizeof(smallblock)); 
    send2(@(bigblock.h), sizeof(bigblock)); 
end; 
+0

@mikey :'smallblock.h '을 보내지 않았습니다. 'smallblock.h '의 주소에서 시작하여'smallblock' 레코드를 보냅니다. IOW,'smallblock.h '의 주소에서 시작하는'sizeof (smallblock.h) + sizeof (smallblock.data)'바이트를 보냈습니다. –

+0

OK gotcha - 그것의 버퍼 [0] - 고마워 - 내가 지울거야 - 내 머리에 새겨진 새겨 져 있지 않아. :-) 그리고 그것은 레미가 의미했던 것입니다. 이것이 내가이 사이트에서 다시 사귀기 시작한 이유입니다. 이 작업을 수행하지 않는 곳에서 2.5 근무를하고 있습니다. '이걸 사용하거나 잃거나'. 이 사이트는 날카로운 체재하는 데 도움이됩니다. 하지만 그가 var를 사용하고 있다면 어쩌면 거기에 기록 된 방식이 괜찮을 수도 있습니다. param이 var로 선언 된 경우 @가 필요합니까? 그것은 어쨌든 포인터입니다. – Vector

+0

또한, 1. 벤치 마크를 반복하고 2. 테스트 순서를 바꾸면 약간의 차이가 있음을 발견했습니다. 3 %는이 허용 오차 이내입니다. 또한 ** 실제 테스트에서 워크로드에 최신 CPU를 얻기 시작하기 전에 ** CPU 집약적 인 계산 **을 수행 한 벤치 마크를 보았습니다. 이것이 종교인지 아닌지는 모르겠지만 설명을 통해이 접근법을 따르는 경향이 있습니다. – alzaimar