2010-07-27 32 views
6

Vị trí của khối try-catch có ảnh hưởng đến hiệu suất không?Vị trí của khối try-catch có ảnh hưởng đến hiệu suất không?

Ví dụ 1: try-catch block bên trong các vòng lặp while

while (true) { 
    try { 
     // ... read from a file 
    } catch (EOFException e) { 
     break; 
    } 
} 

VÍ DỤ 2: try-catch block quanh các vòng lặp while

try { 
    while (true) { 
     // ... read from a file 
    } 
} catch (EOFException e) { 
    // :P 
} 

Một cách logic, những hai ví dụ là tương đương, nhưng tôi nên thích cái nào hơn?

+7

Hai mẫu mã không tương đương. – krock

+1

Vâng trong tình huống thứ hai bạn chắc chắn không muốn 'phá vỡ;' Hoặc chương trình của bạn sẽ không biên dịch, hoặc bạn sẽ thoát khỏi vòng lặp sai. – Phong

+0

Như những người khác đã lưu ý, các ví dụ mã không tương đương. Nếu bạn không ở trong một vòng lặp, bạn có thể không thực sự phanh từ nó. Mặc dù vậy, điều gì ngăn bạn chấm điểm nó? Đó là mã khá đơn giản để chuẩn. – Wolph

Trả lời

1

Bất kỳ giá trị nào có thể không đáng kể, nhưng điều khiến tôi chú ý nhiều hơn với trường hợp đầu tiên là nó gây hiểu lầm: bạn đang bắt ngoại lệ, chỉ để hủy bỏ vòng lặp. Tôi chọn giải pháp 2 chỉ vì nó phù hợp với mục đích. Và bạn tránh bất kỳ chi phí nào theo cách đó.

+0

Việc ngắt thứ hai là một sai lầm từ sao chép/dán. –

+1

Tôi không nói gì về điều đó. Tôi biết đó là một sai lầm và bỏ qua nó bởi vì bạn đã tuyên bố rõ ràng ý định của bạn. – Phong

-1

bạn có thể đột nhập từ bên ngoài không? Tôi không nghĩ rằng giả định của bạn, rằng 2 là tương đương là đúng sự thật.

Trực giác của tôi cho tôi biết rằng thử/bắt ngoài vòng lặp tốt hơn. Nếu có một tác động bytecode bằng cách viết một try/catch, có ít được tạo ra là tốt hơn. Nếu không có tác động trừ khi ngoại lệ xảy ra, thì nó không quan trọng. Tôi không thấy bất kỳ hoàn cảnh nào có thử/bắt bên trong sẽ tốt hơn.

Tôi có thể sai ...

+0

Việc ngắt thứ hai là một sai lầm từ sao chép/dán. –

3

Should java try blocks be scoped as tightly as possible?

này đưa ra một câu trả lời tốt hơn nhiều so với tôi có thể. Tóm lại, họ chỉ thêm một mục nhập vào một bảng được kiểm tra khi ngoại lệ được ném, vì vậy trừ khi một ngoại lệ được ném, chúng không ảnh hưởng đến hiệu suất. Nó sẽ là tốt nhất để chỉ cần đặt nó bất cứ nơi nào làm cho nó tốt nhất để cố gắng phục hồi, nếu bạn có thể. Nếu không, bất cứ nơi nào hữu ích hoặc có ý nghĩa. Mặc dù với sự đột nhập bên ngoài vòng lặp, tôi không nghĩ rằng thứ hai là hợp lệ anyway.

+0

Việc ngắt thứ hai là một sai lầm từ sao chép/dán. –

-1

Ví dụ thứ hai (khối try-catch xung quanh mã) vừa nhanh hơn và rõ ràng hơn.

0

Việc sắp xếp thử nghiệm của bạn không có bất kỳ ảnh hưởng nào đến hiệu suất của ứng dụng của bạn. Ngay cả khi nó đã làm, nó sẽ hoàn toàn không đáng kể, đó không phải là nơi bạn muốn chỉ đạo năng lượng của bạn. Thực hiện dựa trên nhu cầu đầu tiên, và sau đó tối ưu hóa. Không tối ưu hóa vi mô.

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