2013-02-10 46 views
6

Tại Java cấp mã byte, là có bất kỳ sự khác biệt giữa một lệnh if-đơn giản (ví dụ 1) và một tuyên bố nếu bình thường (Ví dụ 2):Simple câu lệnh if vs bình thường câu lệnh if

Ví dụ 1:

if (cond) statement; 

Ví dụ 2:

if (cond) { 
    statement; 
} 

nền của câu hỏi, là tôi đã thấy trong các lớp học "hiệu suất cao" như java.awt.RectanglePoint chỉ các biến thể không có dấu ngoặc nhọn.

Có lợi ích về tốc độ hay chỉ là kiểu mã?

+0

Tại sao bạn không tự phân tích nó? Và xem những gì bạn nhận được. –

+0

Tôi không có kinh nghiệm với mã byte – raceworm

+0

cho trình gỡ xuống: một số nhận xét sẽ thú vị. – raceworm

Trả lời

10

Ngoài khả năng bảo trì mã của bạn, về hiệu suất là chính xác như nhau. Bạn sẽ không đạt được tốc độ từ việc xóa {}, kể từ {} nó không phải là hướng dẫn của chính nó.

Tôi sử dụng bình thường với {} vì làm cho mã dễ đọc (IMO) và kém thuận lợi hơn khi tạo lỗi.

Ví dụ này:

public void A(int i) { 
    if (i > 10) { 
     System.out.println("i"); 
     } 
    } 

    public void B(int i) { 
     if (i > 10) 
      System.out.println("i"); 
    } 

mã byte tạo:

// Method descriptor #15 (I)V 
    // Stack: 2, Locals: 2 
    public void A(int i); 
    0 iload_1 [i] 
    1 bipush 10 
    3 if_icmple 14 
    6 getstatic java.lang.System.out : java.io.PrintStream [16] 
    9 ldc <String "i"> [22] 
    11 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24] 
    14 return 
     Line numbers: 
     [pc: 0, line: 5] 
     [pc: 6, line: 6] 
     [pc: 14, line: 8] 
     Local variable table: 
     [pc: 0, pc: 15] local: this index: 0 type: program.TestClass 
     [pc: 0, pc: 15] local: i index: 1 type: int 
     Stack map table: number of frames 1 
     [pc: 14, same] 

    // Method descriptor #15 (I)V 
    // Stack: 2, Locals: 2 
    public void B(int i); 
    0 iload_1 [i] 
    1 bipush 10 
    3 if_icmple 14 
    6 getstatic java.lang.System.out : java.io.PrintStream [16] 
    9 ldc <String "i"> [22] 
    11 invokevirtual java.io.PrintStream.println(java.lang.String) : void [24] 
    14 return 
     Line numbers: 
     [pc: 0, line: 11] 
     [pc: 6, line: 12] 
     [pc: 14, line: 13] 
     Local variable table: 
     [pc: 0, pc: 15] local: this index: 0 type: program.TestClass 
     [pc: 0, pc: 15] local: i index: 1 type: int 
     Stack map table: number of frames 1 
     [pc: 14, same] 

Như bạn sẽ nhìn thấy đều giống nhau.

+0

i, đã từng sử dụng biến thể xoăn. nhưng mặt trời không phát triển java, thậm chí android.graphics.Rect không sử dụng biến thể với câu lệnh đơn. – raceworm

+1

@raceworm Đó là một quy ước mã mặc dù, nó không có gì để làm với hiệu suất, vì không có sự khác biệt cho mã được tạo ra. – nos

+0

hoàn hảo. ......, tôi cũng nghĩ rằng, số lượng lớn các if trong trường hợp đặc biệt này dễ đọc hơn, với một dòng nếu – raceworm

4

Cả hai đều giống nhau. Biên dịch Java sẽ tạo ra cùng một mã.

Hãy ghi nhớ, tuy nhiên, trong trường hợp không khung, bạn sẽ không thể để thêm nhiều phụ câu lệnh bên trong nếu khối theo cách bạn sẽ có thể trong trường hợp trong ngoặc vuông

+0

Bạn đã thử nghiệm chưa? –

+3

Không có sự khác biệt. Tôi đã không thử nghiệm bằng cách sử dụng một số kiểm tra bytecode, nhưng nếu có sự khác biệt, hai câu lệnh này sẽ được thực hiện khác nhau trong API cây trình biên dịch (và không có sự khác biệt giữa hai) – malejpavouk

+0

và thậm chí nếu có sự khác biệt - Java chỉ trong thời gian biên dịch với HotSpot ... tôi thực sự nghi ngờ, nếu những tối ưu hóa micromicromicro có thể có hiệu lực đo lường ngay cả – malejpavouk

1

Các hai ví dụ bạn đã làm thực hiện chính xác. Ví dụ đầu tiên của bạn là câu lệnh if-then-statement đơn giản, trong khi ví dụ thứ hai của bạn là bình thường câu lệnh if-then.

Thời gian cần để thực thi hai câu lệnh này là như nhau, vì các dấu ngoặc không phải là chỉ lệnh và do đó không ảnh hưởng đến tốc độ. Tôi vẫn sẽ sử dụng câu lệnh if bình thường, vì vậy bạn có thể có nhiều câu lệnh như bạn muốn trong câu lệnh if.

+0

Tôi quan tâm đến differenece cực nhỏ vì tôi cần nó cho hàng ngàn rectangle.inside cuộc gọi mỗi giây trên một thiết bị di động – raceworm

+0

Đó là tốt, nhưng tôi sẽ tập trung vào các vấn đề khác, hogging lớn hơn hiệu suất trước khi bạn tập trung vào những người nhỏ như vậy – syb0rg

+0

hogging pefrormance lớn hơn được giải quyết, bằng cách sử dụng một chỉ số không gian. – raceworm

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