Tôi đã thấy các chủ đề khác nói hiệu suất phản chiếu của java chậm hơn 10-100x so với khi sử dụng các cuộc gọi không phản chiếu.Diễn giải hiệu suất phản chiếu Java: Tại sao nó lại rất nhanh?
Bài kiểm tra của tôi ở 1.6 đã chỉ ra rằng đây không phải là trường hợp nhưng tôi đã tìm thấy một số điều thú vị khác mà tôi cần một người nào đó giải thích cho tôi.
Tôi có các đối tượng triển khai giao diện của mình. Tôi đã thực hiện ba điều 1) bằng cách sử dụng một tham chiếu đến một đối tượng mà tôi đưa đối tượng đó vào giao diện và gọi phương thức thông qua giao diện 2) bằng cách sử dụng tham chiếu đến đối tượng thực sự gọi phương thức trực tiếp và 3). Tôi thấy rằng cuộc gọi giao diện # 1 nhanh nhất được theo sau bởi phản xạ # 3 nhưng tôi nhận thấy rằng cuộc gọi phương thức trực tiếp là chậm nhất bởi một biên độ tốt.
Tôi không hiểu điều đó, tôi đã mong đợi cuộc gọi trực tiếp nhanh nhất, sau đó giao diện, sau đó phản ánh sẽ chậm hơn nhiều.
Blah và ComplexClass nằm trong gói khác với lớp chính và cả hai đều có phương thức doSomething (int x) triển khai giao diện và chỉ in số nguyên x.
Dưới đây là kết quả của tôi (lần trong ms, kết quả w nhiều thử nghiệm/rất giống nhau): gọi một phương pháp trực tiếp: 107.194 gọi một phương thức trực tiếp từ một dàn diễn viên đối tượng cho một giao diện: 89.594 gọi một phương thức thông qua phản ánh: 90453
đây là mã của tôi:
public class Main
{
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
Blah x = new Blah();
ComplexClass cc = new ComplexClass();
test((Object) x, cc);
}
public static void test(Object x, ComplexClass cc)
{
long start, end;
long time1, time2, time3 = 0;
int numToDo = 1000000;
MyInterface interfaceClass = (MyInterface) x;
//warming up the cache
for (int i = 0; i < numToDo; i++)
{
cc.doSomething(i); //calls a method directly
}
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
cc.doSomething(i); //calls a method directly
}
end = System.currentTimeMillis();
time1 = end - start;
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
interfaceClass.doSomething(i); //casts an object to an interface then calls the method
}
end = System.currentTimeMillis();
time2 = end - start;
try
{
Class xClass = x.getClass();
Class[] argTypes =
{
int.class
};
Method m = xClass.getMethod("doSomething", argTypes);
Object[] paramList = new Object[1];
start = System.currentTimeMillis();
for (int i = 0; i < numToDo; i++)
{
paramList[0] = i;
m.invoke(x, paramList); //calls via reflection
}
end = System.currentTimeMillis();
time3 = end - start;
} catch (Exception ex)
{
}
System.out.println("calling a method directly: " + time1);
System.out.println("calling a method directly from an object cast to an interface: " + time2);
System.out.println("calling a method through reflection: " + time3);
}
WHY CW? nó là một câu hỏi liên quan đến lập trình không chủ quan hợp lệ? Và tại sao các lá phiếu đóng lại ?! – hhafez
Tôi đã đặt tiêu đề thành câu hỏi cho những người không thể xem câu hỏi trừ khi nó có dấu. Nhưng, cộng đồng wiki ?? –