2010-02-02 39 views
38

Quy ước gọi fastcall có thực sự nhanh hơn các quy ước gọi điện khác, chẳng hạn như cdecl không? Có bất kỳ điểm chuẩn nào ở đó thể hiện hiệu suất bị ảnh hưởng như thế nào bằng cách gọi quy ước?Fastcall có thực sự nhanh hơn không?

+5

"Hiệu suất bị ảnh hưởng như thế nào khi gọi quy ước?" Marginally. – avakar

+12

Trừ khi nó bị ảnh hưởng ồ ạt. – Crashworks

+1

Xem thêm http://bcbjournal.org/articles/vol4/0004/When_to_use___fastcall.htm?PHPSESSID=7ea0b77df8671b0af9001fbca735c1bc – bluish

Trả lời

30

Tùy thuộc vào nền tảng. Đối với một PowerPC Xenon, ví dụ, nó có thể là một thứ tự của sự khác biệt độ lớn do một vấn đề tải-hit-store với truyền dữ liệu trên stack. Tôi theo kinh nghiệm tính thời gian của một hàm cdecl ở khoảng 45 chu kỳ so với ~ 4 cho một fastcall.

Đối với một x86 không theo thứ tự (Intel và AMD), tác động có thể ít hơn nhiều, vì các thanh ghi đều bị che khuất và đổi tên.

Câu trả lời thực sự là bạn cần tự chuẩn bị nó trên nền tảng cụ thể mà bạn quan tâm.

16

Quy ước gọi nhanh có thực sự nhanh hơn các quy ước gọi điện khác, chẳng hạn như cdecl không?

Tôi tin rằng việc triển khai Microsofts fastcall trên x86 và x64 liên quan đến việc chuyển hai thông số đầu tiên trong sổ đăng ký thay vì trên ngăn xếp.

Vì nó thường tiết kiệm ít nhất bốn lần truy cập bộ nhớ, vâng, thông thường nó sẽ nhanh hơn. Tuy nhiên, nếu chức năng liên quan là đăng ký bị bỏ đói và do đó có khả năng viết chúng cho người dân địa phương trên stack anyway, không có khả năng là một sự gia tăng đáng kể.

+4

Trong x64 chỉ có một quy ước gọi là –

10

Quy ước gọi điện (ít nhất là trên x86) thực sự không tạo ra nhiều khác biệt về tốc độ. Trong Windows, _stdcall được tạo mặc định bởi vì nó tạo ra các kết quả hữu hình cho các chương trình không phổ biến ở chỗ nó thường dẫn đến kích thước mã nhỏ hơn khi so sánh với _cdecl. _fastcall không phải là giá trị mặc định bởi vì sự khác biệt mà nó tạo ra ít hữu hình hơn. Những gì bạn làm cho trong đối số đi qua đăng ký bạn bị mất trong cơ quan chức năng ít hiệu quả hơn (như đã đề cập trước đây bởi Anon.). Bạn không đạt được bất cứ điều gì bằng cách đi qua trong sổ đăng ký nếu chức năng được gọi ngay lập tức cần phải tràn tất cả mọi thứ ra vào bộ nhớ để tính toán riêng của mình.

Tuy nhiên, chúng tôi có thể thúc đẩy các ý tưởng lý thuyết cả ngày - chuẩn mã của bạn cho câu trả lời đúng. _fastcall sẽ nhanh hơn trong một số trường hợp và chậm hơn trong các trường hợp khác.

8

Trên x86 hiện đại - không. Giữa cache L1 và trong lót không có chỗ cho fastcall.

+10

. fastcall cũng không cdecl cũng như bất kỳ quy ước gọi điện nào khác. – Crashworks

+7

Chính xác. Lấy từ L1 là 1 chu kỳ qua đăng ký - trong hầu hết các trường hợp, nó thấp hơn mức ồn, thật khó để có thể đánh giá nó một cách đáng tin cậy. Và chức năng mà một vài chu kỳ trên cuộc gọi là sự khác biệt quan trọng nên được inlined anyway. – ima

+1

Tôi phải đồng ý với điều này - bất kỳ chức năng nào đủ đơn giản để hưởng lợi từ fastcall sẽ được hưởng lợi từ nội tuyến hơn nữa. –

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