2010-02-02 31 views

Trả lời

11

Chỉ nhanh hơn 5 lần? Bạn làm tôi ngạc nhiên. Có lẽ điều đó có nghĩa là dữ liệu mẫu của bạn không có nhiều số 0 trong đó.

Trường hợp ngoại lệ đắt hơn so với so sánh đơn giản. Khi được sử dụng đúng (nghĩa là trong trường hợp ngoại lệ), chúng không có xu hướng cản trở hiệu suất đáng kể - bởi vì nếu bạn ném đủ ngoại lệ cho nó để tạo ra tác động lớn, rất có thể dịch vụ của bạn đã được hosed. Nó không gây ra một vấn đề khi bạn sử dụng ngoại lệ để cố gắng bỏ qua các điều kiện mà bạn có thể rất dễ dàng kiểm tra để bắt đầu - như thế này.

Một điều cần lưu ý về chi phí ngoại lệ: chi phí nhiều hơn trong trình gỡ lỗi nhiều hơn khi chạy mà không có trình gỡ lỗi đính kèm; đặc biệt là ngoại lệ đầu tiên cần tải một loạt tài nguyên có thể mất vài giây thay vì vi/mili giây. Nếu bạn đang đi đến mã điểm chuẩn, điều quan trọng là bạn không làm điều đó trong một trình gỡ lỗi - đó là sự thật nói chung, nhưng đặc biệt là đối với trường hợp ngoại lệ.

10

Vì trường hợp ngoại lệ rất tốn kém.

Khi ngoại lệ được ném, thời gian chạy cần phải chọn ra khá nhiều thông tin (ngăn xếp dấu vết ví dụ) và bong bóng chúng lên. Điều này cần có thời gian và nguồn lực, khi một thử nghiệm cho giá trị 0 là rất rẻ so với.

Xem this SO question hỏi cách ngoại lệ đắt tiền để biết thêm thông tin.

5

Err, vì ngoại lệ chậm hơn kiểm tra. Trường hợp ngoại lệ thường có rất nhiều cơ sở hạ tầng xung quanh họ rằng một tuyên bố đơn giản if không.

Chúng không hoạt động tương đương vì bạn có nhiều thông tin được phân phối trong một ngoại lệ ngay cả khi bạn chọn không sử dụng nó như trong trường hợp này.

3

Tại sao ngoại lệ lại chậm?

Bởi vì nhiều thứ xảy ra khi ngoại lệ bị ném và bị bắt. Xem Chris Brumme's post about the managed exception modelthis post about the underlying Win32 SEH model để biết chi tiết.

Tại sao thử nghiệm đơn giản lại nhanh?

Bởi vì nó chỉ thực hiện một lệnh để nhảy tùy thuộc vào kết quả so sánh hai số nguyên ít hơn nhiều so với ngoại lệ.

Điều đó có nghĩa là tôi luôn cố gắng tránh ngoại lệ?

Không, nó phụ thuộc vào ngữ nghĩa. Nếu chia cho số không là trường hợp ngoại lệ thực sự mà bạn không mong đợi xảy ra và chương trình của bạn không thể xử lý hợp lý, thì hãy để ngoại lệ xảy ra và làm hỏng chương trình của bạn.Tuy nhiên, nếu đó là trường hợp dự kiến ​​và bạn có thể xử lý nó một cách hợp lý thì có vẻ như hợp lý để tránh ngoại lệ.

1

Exceptions rất chậm - Đây là lý do mà khuôn khổ Net có phương pháp TryParse:

// This is much quicker... 
double result; 
if (!double.TryParse("Twelve", out result)) 
{ 
    result = -1; 
} 
return result; 

// Than this... 
try 
{ 
    return double.Parse("Twelve"); 
} 
catch 
{ 
    return -1; 
} 

bạn nên luôn luôn cố gắng và tránh trường hợp ngoại lệ (ngoại trừ trong trường hợp đặc biệt - haha ​​...)