2013-06-18 31 views
10

Tôi tự hỏi nếu điều này làm cho bất kỳ sự khác biệt:Hiệu suất: List.Count vs kiểm tra một biến lưu trữ

for (int i = 0; i < values.Count; i++) 
     { 
      // 
     } 

vs

int num = values.Count; 

for(int=0; i<num; i++) 
{ 

} 

Tôi nghĩ rằng cách tiếp cận thứ hai là tốt hơn bởi vì bạn không cần phải đếm tất cả các mục trong mỗi lần lặp. Nhưng tôi có thể sai. Ai đó có thể thắp sáng tôi không?

+6

Theo nguyên tắc chung, nếu bạn đang băn khoăn về hiệu suất, bạn nên định cấu hình ứng dụng của mình để tìm ra chỗ bị tắc nghẽn. Các trình biên dịch hiện đại làm một công việc rất tốt ở tối ưu hóa và các nút cổ chai thường không phải là nơi mà người ta cho là. Trong _Thực hành lập trình, Brian Kernighan mô tả ngay cả những người thông minh tại Bell Labs cũng đã kết thúc việc tối ưu hóa điều sai trái. – David

+3

Bạn đã viết mã theo cả hai cách. ** Chạy cả hai cách và sau đó bạn sẽ biết cái nào nhanh hơn **. Sử dụng * science * để giải quyết vấn đề này, không phải * bói toán *. –

Trả lời

11

Danh sách đã lưu trữ Count nội bộ của nó. So sánh bạn đang làm có liên quan đến kiểu mã, không phải hiệu suất. Kể từ khi trình biên dịch sẽ tối ưu hóa việc thu hồi các 'Đếm'

+2

Trình biên dịch không thể tối ưu hóa việc truy xuất 'Đếm', một thuộc tính có thể thay đổi được trên một đối tượng khác. Các thử nghiệm của tôi với IL được tối ưu hóa cho biết rằng 'Đếm' được đọc lại trên mỗi lần lặp lại. – spender

+0

@spender IL có thể được chuyển đổi bởi JIT, hãy thử đọc assembly được tối ưu hóa được tạo ra bởi JIT, dưới đây là hướng dẫn: http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807. aspx – Esailija

+0

Tôi không tin rằng JIT là đủ thông minh để thực hiện một tối ưu hóa đòi hỏi nó phải biết nếu danh sách đang được thao tác từ một chủ đề khác. Nghe có vẻ hơi tốn kém với tôi. Tôi sẽ xem xét hội đồng JIT được tối ưu hóa, nhưng tôi đang cố gắng xem cách điều này có thể được tối ưu hóa. – spender

3

Điều này hoàn toàn phụ thuộc vào những gì values là. Count có thể được triển khai hoàn toàn khác nhau, tùy thuộc vào loại đối tượng này là gì.

Nếu bạn đang nói về một số chung List<T> - thì Đếm được thực hiện như một thuộc tính nội bộ không được đánh giá lại - và do đó là lựa chọn tốt hơn.

8

Vâng, bạn có thể nhìn vào mã NET Nguồn đây http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#aa7e01fcb80a917e

public int Count { 
     get { 
      Contract.Ensures(Contract.Result<int>() >= 0); 
      return _size; 
     } 
    } 

Nó sẽ xuất hiện mà tài sản trên danh sách Count sẽ kiểm tra nội bộ nhanh chóng và sau đó trả về _size. Vì vậy, nó phải được khá gần với hiệu suất của bạn lưu trữ các giá trị chính mình.

+0

Tôi đang tìm kiếm tất cả tài liệu nguồn cho +1 này nhờ – RadioSpace