2009-02-24 40 views
6

Biến nhượng có đắt hơn so với kiểm tra không? Ví dụ, có đáng để kiểm tra rằng foo không phải là null trước khi gán nó không?Kiểm tra nếu biến null trước khi gán cho null?

if (foo != null) { 
    foo = null; 
} 

Hoặc điều này đáng lo ngại về không có gì?

+0

Tôi đang bỏ qua câu hỏi này bởi vì tôi cho rằng thông điệp (nhất quán) trong tất cả các câu trả lời là quan trọng. IMHO, Knuth như được trích dẫn dưới đây là hoàn toàn đúng. Và ngay cả khi điều này giảm trong 3% các trường hợp mà nó có thể quan trọng, chỉ có hồ sơ vững chắc và điểm chuẩn sẽ đưa ra một câu trả lời dứt khoát. – RBerteig

+0

Tôi đoán các câu trả lời nhất quán cũng chỉ ra rằng tôi đã nhận được một cái gì đó rất rõ ràng sai ... – Albert

Trả lời

30

Đây là một vi tối ưu hóa (và có thể là một cái gì đó được xử lý bởi trình biên dịch anyways). Đừng lo lắng về điều đó. Bạn sẽ nhận được một sự trở lại lớn hơn nhiều bằng cách tập trung vào chương trình thuật toán thực tế của bạn.

Chúng ta nên quên hiệu quả nhỏ, nói khoảng 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi điều ác. - Donald Knuth

+0

Vì sự khác biệt về cơ bản là không, mà sẽ rõ ràng hơn? Với việc kiểm tra hay không? – Albert

+0

Không có séc. –

+0

@mike, bạn chính xác. nhưng, chúng ta không bị lệch khỏi quesiton thực tế ở đây? câu hỏi sẽ hiệu quả hơn. nhưng chúng ta đang nói về cách chúng ta không nên dành quá nhiều thời gian vào những điều nhỏ nhặt. thats thực hành tốt, chúng tôi đang nói về và không phải là câu trả lời cho câu hỏi! –

7

Đây thực sự là (rất, rất nhẹ) ít hiệu quả hơn. Các phép gán biến tương đương với kiểm tra null, cộng thêm một nhánh phụ có thể. Không phải là nó tạo ra nhiều khác biệt.

Hoặc điều này đáng lo ngại về không có gì?

Bạn đã hiểu.

3

Tôi sẽ không lo lắng về điều đó - đó chỉ là các dòng mã bổ sung để duy trì. Đây là loại tối ưu hóa vi mô mà bạn không bao giờ nên làm trừ khi bạn có bằng chứng được chứng minh rằng đó là nút cổ chai của bạn.

1

foo = null; 

if (foo != null) 
    foo = null; 

Nếu tôi nhìn vào mã khối thứ hai tôi sẽ nghĩ rằng bạn chỉ muốn đặt biến foo null nếu nó không phải là null trước khi, và nếu tôi nhìn vào các mã đầu tiên tôi sẽ nghĩ bạn muốn đặt biến foo thành null.

Tôi biết điều này là do ví dụ bạn đã viết, nhưng cuối cùng loại tối ưu hóa vi mô này chỉ thêm nhầm lẫn (không đáng giá).

+0

Phiên bản nào khó hiểu hơn? – Albert

1

Điều này sẽ làm cho mã của bạn khó đọc hơn rất nhiều ngay cả khi đó là một tối ưu hóa, nó sẽ không đáng để gây rắc rối.

Và nó không phải là tối ưu hóa. Trên hầu hết các cpu hiện đại nếu báo cáo là khá tốn kém.

+0

Phiên bản nào khó hiểu hơn? – Albert

+0

Rõ ràng cả hai phiên bản đều gây nhầm lẫn cho một số người. –

+0

Ah, điều đó tuyệt vời;) – Albert

1

Điều này sẽ có ít hoặc không có hiệu lực. Tôi không nghĩ rằng bạn thậm chí có thể tạo ra một điểm chuẩn để chứng minh sự khác biệt.

Trong thực tế, một số người lập luận rằng gán null ở tất cả là một mùi code (xem PMD detector for NullAssignment):

Gán một "null" cho một biến (bên ngoài kê khai của nó) là thường hình thức xấu. Một số lần, nhiệm vụ là dấu hiệu cho thấy lập trình viên không hoàn toàn hiểu điều gì đang xảy ra trong mã . LƯU Ý: Loại nhiệm vụ này có thể trong các trường hợp hiếm hoi có ích cho việc khuyến khích thu gom rác thải.Nếu đó là những gì bạn đang sử dụng nó cho, bởi mọi cách, bỏ qua quy tắc này :-)

Nói chung, tôi thận trọng cá nhân của bất cứ điều gì mà cố gắng để khuyến khích thu gom rác thải (bạn hầu như luôn luôn có được hiệu ứng mà bạn không mong đợi).

+0

Bạn nói đúng, tôi không thể tạo điểm chuẩn cho thấy bất kỳ sự khác biệt có ý nghĩa nào. Tôi sẽ suy nghĩ về việc có hay không gán cho null là thực hành kém vào một ngày sau đó. Cảm ơn! – Albert

2

Trước hết, đó là tối ưu hóa vi mô. Vì vậy, không cần phải lo lắng nhiều về nó.

Nhưng để trả lời câu hỏi của bạn, bạn cần phải giảm nó xuống chỉ một dòng. (như tất cả các mã của bạn hiện là để thiết lập nó để NULL).

foo = NULL; 

Lý do được rằng,

So sánh là một hoạt động nhiều tốn kém hơn nhiều so với chuyển nhượng. (Như so sánh ăn nhiều hướng dẫn lắp ráp tương đối. Nói chung một phép trừ và so sánh với số không hoặc một XOR và so sánh với số không). Nhiệm vụ chỉ dẫn ít hơn.

+0

"So sánh là một hoạt động tốn kém hơn nhiều so với chuyển nhượng" Trích dẫn cần thiết :) – user

2

Nếu bạn có trình biên dịch tốt, chúng sẽ tạo mã giống hệt nhau. Nếu bạn có trình biên dịch crappy thì trình biên dịch có số if sẽ tồi tệ hơn. Về phân bổ phần cứng năm 2009 cho các biến rất rẻ, và các nhánh có điều kiện đôi khi có thể tốn kém.

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