2012-03-06 36 views
11

Trong java Tôi tự hỏi mà trong số này là hiệu quả hơn:hai IF báo cáo so với một tuyên bố VÀ

if(something) 
    { 
     if(something) 
    } 

hoặc

if((something) &&(something)) 

tôi đã tự hỏi những gì công đức tạo được cho cả về hiệu suất . Những giải pháp nào cho chính họ tốt hơn đối với các đối tượng dữ liệu khác nhau.

+1

cách đầu tiên thường thấy trong mã được viết bởi những người không biết/hiểu rằng các mạch ngắn của '&&'. Tôi đã thấy 15+ tầng 'if' trong mã kế thừa, và nhanh chóng thay thế tất cả chúng bằng cách thứ hai. (Bên cạnh: VB.NET 'And' là một ví dụ mà nó không ngắn mạch, nhưng' AndAlso' không) – Seph

Trả lời

19

Hiệu suất sẽ giống hệt nhau. Câu lệnh đầu tiên sẽ được đánh giá và chỉ khi nó là true thì câu lệnh thứ hai sẽ được đánh giá.

Đây chỉ là vấn đề dễ đọc. Trừ khi có cái gì đó cần phải được thực hiện nếu tuyên bố đầu tiên là đúng, bất kể thứ hai, tôi muốn đi với cả hai trong cùng một dòng như nó là rõ ràng hơn rằng cả hai báo cáo cần phải đúng cho một cái gì đó xảy ra. Bạn cũng không phải thụt lề không cần thiết.

+2

+1: Mã byte trong trường hợp đơn giản nhất là giống hệt nhau –

+0

Tôi nghĩ hai câu lệnh if 'if' tốt hơn cho khả năng đọc nếu một số điều kiện được kiểm tra bằng cách sử dụng nhiều phép toán boolean và có nhiều điều kiện. Ví dụ: để kiểm tra xem "num là lũy thừa 2" và "kích thước là dương", tôi nghĩ sẽ khó đọc hơn nếu viết (python) "nếu num> 0 và num & (num-1)) == 0 và kích thước == 0: ... " – Sean

2

Trong Java, && đoản mạch. Điều này có nghĩa là nếu điều kiện đầu tiên trong số a && b đánh giá là false thì điều kiện thứ hai thậm chí không được đánh giá.

Do đó, hai kết quả gần như chắc chắn dẫn đến mã giống nhau và không có sự khác biệt về hiệu suất.

Trong hai biểu mẫu, bạn nên sử dụng bất kỳ kết quả nào trong mã rõ ràng hơn.

2

Nói chung chúng giống nhau. Nếu giá trị đầu tiên được đánh giá sai, giá trị thứ hai sẽ không được đánh giá. Trong trường hợp bạn muốn một cái gì đó xảy ra nếu cái đầu tiên là sai, bạn nên sử dụng câu lệnh if. Nếu không, nếu bạn chỉ muốn chắc chắn cả hai đều đúng và không làm gì nếu một trong số chúng trả về false, bạn có thể sử dụng tùy chọn thứ hai.

1

Lưu ý rằng toán tử && trong Java là toán tử ngắn mạch. Điều đó có nghĩa là nếu biểu thức ở bên trái của &&false, Java sẽ không bận tâm để đánh giá sự xuất hiện ở bên phải, bởi vì kết quả sẽ là false, bất kể biểu thức bên tay phải đánh giá là gì .

Vì vậy, hiệu quả, hiệu suất của hai công trình này sẽ giống nhau.

Lưu ý rằng Java cũng có một toán tử &. Đó là một trong những không ngắn mạch: nó sẽ luôn luôn đánh giá các biểu thức trên cả hai mặt của &.

0

Tôi không biết nhưng, bằng trực giác, tôi nghĩ rằng khi được biên dịch thành bytecode thì không có sự khác biệt ...

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