Nó có thể dẫn đến mã byte nhỏ hơn một chút, vì các phương thức tĩnh sẽ không được truy cập this
. Tôi không nghĩ nó tạo ra bất kỳ sự khác biệt nào về tốc độ (và nếu có, nó có thể quá nhỏ để tạo ra sự khác biệt về tổng thể).
Tôi sẽ làm cho chúng tĩnh, vì tôi thường làm như vậy nếu có thể. Nhưng đó chỉ là tôi.
EDIT: Câu trả lời này tiếp tục bị hạ thấp, có thể là do sự khẳng định không có căn cứ về kích thước mã byte. Vì vậy, tôi thực sự sẽ chạy thử nghiệm.
class TestBytecodeSize {
private void doSomething(int arg) { }
private static void doSomethingStatic(int arg) { }
public static void main(String[] args) {
// do it twice both ways
doSomethingStatic(0);
doSomethingStatic(0);
TestBytecodeSize t = new TestBytecodeSize();
t.doSomething(0);
t.doSomething(0);
}
}
Mã byte (lấy với javap -c -private TestBytecodeSize
):
Compiled from "TestBytecodeSize.java"
class TestBytecodeSize extends java.lang.Object{
TestBytecodeSize();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
private void doSomething(int);
Code:
0: return
private static void doSomethingStatic(int);
Code:
0: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: invokestatic #2; //Method doSomethingStatic:(I)V
4: iconst_0
5: invokestatic #2; //Method doSomethingStatic:(I)V
8: new #3; //class TestBytecodeSize
11: dup
12: invokespecial #4; //Method "<init>":()V
15: astore_1
16: aload_1
17: iconst_0
18: invokespecial #5; //Method doSomething:(I)V
21: aload_1
22: iconst_0
23: invokespecial #5; //Method doSomething:(I)V
26: return
}
Gọi phương thức tĩnh mất hai mã byte (byteops?): iconst_0
(Đối với đối số) và invokestatic
.
Gọi phương thức không tĩnh mất ba: aload_1
(đối vớiTestBytecodeSize
đối tượng, tôi cho là), iconst_0
(đối với đối số) và invokespecial
. (Lưu ý rằng nếu đây không phải là các phương thức riêng tư, thì nó sẽ invokevirtual
thay thế invokespecial
; xem Phương thức gọi JLS §7.7 .)
Bây giờ, như tôi đã nói, tôi không hy vọng sẽ có bất kỳ sự khác biệt lớn nào về hiệu suất giữa hai điều này, ngoài thực tế invokestatic
đòi hỏi một mã byte ít hơn.invokestatic
và invokespecial
cả hai nên nhanh hơn một chút invokevirtual
, vì cả hai đều sử dụng liên kết tĩnh thay vì động, nhưng tôi không biết liệu cái này có nhanh hơn cái kia không. Tôi cũng không thể tìm thấy bất kỳ tài liệu tham khảo tốt. Gần nhất tôi có thể tìm thấy là bài viết JavaWorld 1997 này , về cơ bản khôi phục lại những gì tôi vừa nói:
Các hướng dẫn nhanh nhất rất có thể sẽ là invokespecial
và invokestatic
, bởi vì các phương thức được gọi bởi các hướng dẫn này bị ràng buộc tĩnh. Khi JVM giải quyết tham chiếu tượng trưng cho các hướng dẫn này và thay thế nó bằng tham chiếu trực tiếp, tham chiếu trực tiếp đó có thể sẽ bao gồm một con trỏ tới mã byte thực tế.
Nhưng nhiều thứ đã thay đổi kể từ năm 1997.
Vì vậy, kết luận ... tôi đoán tôi vẫn còn gắn bó với những gì tôi đã nói trước đó. Tốc độ không phải là lý do để chọn cái khác, vì nó sẽ là tối ưu hóa vi mô tốt nhất.