2010-09-28 25 views
6

Có thêm thời gian chạy bổ sung nào khi gọi các hàm bị quá tải không?Có quá tải chức năng có thời gian chạy trên cao trong Delphi không?

(Tôi yêu cầu này đặc biệt cho Delphi, trong trường hợp câu trả lời là không giống nhau cho tất cả các ngôn ngữ biên dịch)

Tôi nghĩ rằng không phải là cần được giải quyết trong thời gian biên dịch, nhưng bạn không bao giờ có thể chắc chắn có thể giúp bạn ?

Trả lời

19

Tất nhiên bạn có thể chắc chắn vì đó là documented. Là trình biên dịch mà giải quyết nó tại thời gian biên dịch, do đó, không có thêm chi phí trên gọi các chức năng quá tải trong Delphi.

[Chỉnh sửa]

Tôi đã làm một thử nghiệm nhỏ dành cho bạn:

var 
    j: Integer; 
    st: string; 

procedure DoNothing(i: Integer); overload; 
begin 
    j := i; 
end; 

procedure DoNothing(s: string); overload; 
begin 
    st := s; 
end; 

procedure DoNothingI(i: integer); 
begin 
    j := i; 
end; 

procedure TForm2.Button1Click(Sender: TObject); 
const 
    MaxIterations = 10000000; 
var 
    StartTick, EndTick: Cardinal; 
    I: Integer; 
begin 
    StartTick := GetTickCount; 
    for I := 0 to MaxIterations - 1 do 
    DoNothing(I); 
    EndTick := GetTickCount; 
    Label1.Caption := Format('Overlaod ellapsed ticks: %d [j:%d]', [EndTick - StartTick, j]); 
    StartTick := GetTickCount; 
    for I := 0 to MaxIterations - 1 do 
    DoNothingI(I); 
    EndTick := GetTickCount; 
    Label1.Caption := Format('%s'#13'Normal ellapsed ticks: %d [j:%d]', [Label1.Caption, EndTick - StartTick, j]); 
end; 

Kết quả: Hầu như tất cả các thời gian 31 Bọ ve (mili giây) cho cả trên máy dev của tôi, đôi khi quá tải chỉ mất 16 ve .

alt text

+2

+1 bạn đánh bại tôi với nó :) –

+0

Phải. Có một lượng không đáng kể thời gian biên dịch, nhưng không có thời gian chạy. –

+2

Mã được biên dịch không quan tâm đến tên mà là địa chỉ của thủ tục đúng để gọi. Vì tên dịch này => địa chỉ được thực hiện tại thời gian biên dịch, cuối cùng, vào thời gian chạy, nó chính xác giống như có các tên khác nhau. –

3

quá tải đã được giải quyết tại thời gian biên dịch (không overhead), nhưng quan trọng hơn có overhead! virtual nhanh hơn dynamic:

http://docwiki.embarcadero.com/RADStudio/en/Methods

ảo so với động
Trong Delphi cho Win32, phương pháp ảo và năng động là ngữ nghĩa tương đương.
Tuy nhiên, chúng khác nhau trong việc thực hiện gửi phương thức cuộc gọi vào thời gian chạy: phương pháp ảo tối ưu hóa tốc độ, trong khi các phương pháp động tối ưu hóa cho kích thước mã.

Các vấn đề liên quan