Hiệu suất của quá trình truyền phụ thuộc vào việc triển khai JVM.
JLS 5.5 chỉ xác định các yêu cầu cho phép đúc (bao gồm thuật toán đệ quy), nhưng không đặt bất kỳ yêu cầu nào khi triển khai. Trên thực tế, runtime cast rules in 5.5.3 cũng được xác định theo cùng một cách. Tất cả các triển khai JVM tạo ra cùng một kết quả như thuật toán được đề xuất được chấp nhận như một JVM thích hợp.
Nói chung, truyền xuống C
mất thêm một chút thời gian kể từ khi JVM phải kiểm tra loại thời gian chạy của đối tượng. Khi truyền tối đa A
, không có lý do gì để thực hiện kiểm tra tương tự, vì B
mở rộng A
.
Thực ra, JVM không quan tâm đến số lượng phương thức và trường. Nó chỉ so sánh phân cấp kiểu, cùng bạn có thể kiểm tra với sự phản ánh (o.getClass()
)
tôi đã thực hiện một mẫu mã như sau, một trong những yếu hèn, sau đó là một sự liệng lên:
Object o = new Integer(1);
Integer i = (Integer) o;
Object o2 = i;
Các bytecode biên soạn như sau:
0 new java.lang.Integer [16]
3 dup
4 iconst_1 <-- 1 as a parameter to the constructor
5 invokespecial java.lang.Integer(int) [18] <-- constructor
8 astore_1 [o] <-- store in 'o'
9 aload_1 [o]
10 checkcast java.lang.Integer [16] <-- DOWNCAST CHECK, SPECIAL BYTECODE
13 astore_2 [i]
14 aload_2 [i]
15 astore_3 [o2] <-- WITH UPCAST NO CHECK
Vì vậy, có một hướng dẫn JVM cụ thể kiểm tra phần tử ở đầu ngăn xếp với một lớp nhất định.
Với upcast, không có kiểm tra nào cả.
Kích thước của các lớp (số trường, phương pháp, dấu chân thực tế) không quan trọng, vì đoạn kiểm tra Class
(siêu dữ liệu, thực sự là đối tượng).
Số cấp độ phân cấp và số nếu giao diện được triển khai (nếu truyền tới giao diện) không quan trọng, bởi vì đó là cây kế thừa/thực thi di chuyển để kiểm tra.
Tôi sẽ ngạc nhiên nếu không có loại bộ nhớ nào là cache cho lần kiểm tra này.
"vì JVM phải kiểm tra loại thời gian chạy của đối tượng" nó kiểm tra như thế nào? –
Cảm ơn, sẽ là tuyệt vời nếu bạn có thể cho tôi biết trong ngắn hạn những loại hoạt động nào isAssignableForm làm gì? Thật khó để phân tích loại mã nguồn này. –
Thực ra, tôi đã sai, sự thật thậm chí còn bản địa hơn 'isAssignableFrom()' – gaborsch