2012-09-20 23 views
9

thể trùng lặp:
Why are interface method invocations slower than concrete invocations?Loại nào nhanh, Tóm tắt hoặc Giao diện?

tôi thời gian gần đây đã có một cơ hội để xuất hiện trong một cuộc phỏng vấn, trong đó người phỏng vấn hỏi cái nào là nhanh hơn trong Tóm tắt lớpInterface. Mặc dù tôi đã nhầm lẫn với câu hỏi nhưng tôi trả lời Giao diện chủ yếu là vì tôi nghĩ rằng khái niệm ràng buộc muộn có thể gây ra sự chậm trễ hiệu suất trong lớp Tóm tắt. Sau khi khám phá cùng một câu hỏi này trên web, tôi đã biết rằng các phương thức Tóm tắt nhanh hơn mặc dù theo một số blog Các phương thức giao diện nhanh hơn. Tôi hơi bối rối vì vậy tôi nghĩ để hỏi câu hỏi này để có một sự hiểu biết chính xác mà cái nào là nhanh hơn và tại sao với lý do mạnh mẽ.

Theo lớp Tóm tắt sau đây là nhanh nhưng không có lý do chính đáng cho nó. http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

Trả lời

9

Câu trả lời tùy thuộc vào ngôn ngữ lập trình và có thể trình biên dịch bạn sử dụng. Trong các môi trường như máy ảo Java, nơi tối ưu hóa thời gian chạy được sử dụng, nó có thể không được trả lời. Và thành thật mà nói, trong một dự án Java điển hình, không ai quan tâm bởi vì ngay cả khi có sự khác biệt, nó sẽ rất nhỏ đến nỗi nó sẽ không làm chậm phần mềm của bạn một cách đáng chú ý. Trừ khi bạn có những ràng buộc thời gian thực nghiêm ngặt, trong trường hợp đó bạn sẽ không sử dụng Java (và có thể không có đa hình nào cả).

Về cơ bản, cả phương thức giao diện và phương pháp trừu tượng đều sử dụng tính năng động, do đó sự khác biệt là tối thiểu nếu có bất kỳ điều gì. Nếu không có nhiều kiến ​​thức về các chi tiết, tôi sẽ giả định rằng về mặt lý thuyết, các phương thức trừu tượng gửi nhanh hơn miễn là ngôn ngữ không thực hiện nhiều thừa kế cho các lớp. Vị trí của con trỏ phương thức trong vector công văn sẽ là tĩnh, trong khi nó không dành cho các phương thức giao diện (một lớp thường có thể thực hiện nhiều giao diện).

Nhưng như tôi đã nói, tôi không biết chi tiết về những gì xảy ra trong trình biên dịch. Có thể có những yếu tố khác mà tôi không nghĩ đến. Nếu tôi phải trả lời câu hỏi này trong một cuộc phỏng vấn, tôi xin trích dẫn "tối ưu hóa sớm của Don Knuth là gốc rễ của mọi điều ác".

0

Câu trả lời hay nhất cho câu hỏi đó là "Tôi sẽ viết một bài kiểm tra nhỏ để tìm hiểu, nếu tôi thực sự, thực sự cần thiết để". Nhận một ví dụ thực tế và chạy nó, trong các điều kiện được kiểm soát, với hai triển khai chỉ khác nhau trong giao diện so với lớp trừu tượng. Không có triển khai cụ thể, các câu hỏi "nhanh hơn" có ý nghĩa rất ít. Hoặc là người phỏng vấn đang cố gắng khoe khoang (và có lẽ không biết gì về câu trả lời thực tế), cố gắng kiểm tra các kỹ năng tư duy phê phán của bạn (câu hỏi này có ý nghĩa không?), Hoặc cực kỳ chua chát.

Quy tắc tối ưu hóa đầu tiên là không tối ưu hóa ... chưa. Quy tắc thứ hai là hồ sơ chương trình của bạn để tìm các nút cổ chai trước khi tái cấu trúc: thay đổi thuật toán hoặc cấu trúc dữ liệu đúng nơi thường là điều duy nhất cần thiết; và tôi sẵn sàng đặt cược rằng, trong Java, trình biên dịch hotspot sẽ tạo ra bất kỳ sự khác biệt nào giữa trừu tượng và giao diện, nếu có, thực sự khó tìm thấy thực sự.

+0

bị cám dỗ nghiêm trọng để lặp lại quy tắc đầu tiên hai lần, như trong tất cả những "quy tắc đầu tiên của Câu lạc bộ ..." – tucuxi

+1

Một vấn đề với triết lý đó là nó sẽ không tiết lộ liệu các yếu tố thực tế có thể gây ra một cách tiếp cận tốt hơn đôi khi thực hiện tồi tệ hơn nhiều so với một cách thường thấp hơn.Ví dụ, với sự lựa chọn giữa hai phần mã, một trong số đó yêu cầu một vài bốn truy cập vtable và một trong số đó yêu cầu phân bổ thêm 32 byte rác, có thể là phần tạo ra nhiều rác hơn thường nhanh hơn, nhưng có thể cuối cùng sẽ chậm hơn nhiều nếu có rất nhiều rác thải gen2 được xúc động giữa các chu kỳ thu thập gen0. – supercat

+0

quan điểm của tôi là việc tối ưu hóa tay ở mọi nơi là việc sử dụng thời gian của bạn kém hơn nhiều so với việc tối ưu hóa * chỉ khi nó thực sự đếm *. Hồ sơ đầu tiên, tìm những gì nóng và tối ưu hóa * đó *. Nếu không, bạn đang lãng phí thời gian và công sức. – tucuxi

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