2013-08-23 56 views
5

Tôi chưa bao giờ thấy một hướng dẫn hoặc một số bài giảng, trong đó cho thấy một cổ điển cho vòng lặp witout thứ tự post-increment.pre-increment vs post-increment - cho vòng lặp tốc độ

for (int i=0; i<array.length; i++) {} 

Nếu bạn sử dụng POST-POST, biến "i" sẽ được lưu trong bộ nhớ cache, trước khi nó được tăng lên! Nhưng điều này không có ý nghĩa, bởi vì lệnh kết thúc trực tiếp.

Theo tôi, điều này làm cho ý nghĩa hơn:

for (int i=0; i<array.length; ++i) {} 

Nếu bạn không hiểu cho đến bây giờ, tôi đi một chút nữa (sry cho tiếng anh của tôi):

Trong vòng đầu tiên :

  1. Cache giá trị thực của i. (Lưu ý: không di chuyển giữa, vì vậy không có lý do để làm điều này)
  2. Tăng i
  3. Đi trước

Trong vòng lặp thứ hai:

  1. Tăng i trực tiếp
  2. Go phía trước.

Vì vậy, vòng lặp thứ hai có hiệu suất cao hơn mà không làm giảm chất lượng. Có ý kiến ​​nào khác không?

+1

Cách duy nhất để biết liệu vòng lặp thứ hai có hiệu quả hơn hay không là đo nó (giả sử mã lắp ráp được tạo ra khác nhau). Với một 'int' tôi nghi ngờ nó tạo ra sự khác biệt. Với một số loại trình vòng lặp, có lẽ. ** Chỉnh sửa ** Tôi đang nói C++ ở đây. – juanchopanza

+2

Khi bạn nói "biến * sẽ được lưu trong bộ nhớ cache *", bạn có sử dụng bất kỳ sự hiểu biết hoặc nghiên cứu nào về tình huống này hay bạn chỉ đang suy đoán? –

+6

Tôi thấy một thẻ c + +, nhưng sau đó nó biến mất và tôi chỉ thấy java, vì vậy tôi đã đăng dup cho java. –

Trả lời

6

Trong Java, không có điểm nào trong suy nghĩ ở cấp độ này. Thời gian chạy Java là cho đến nay loại bỏ từ những gì bạn nghĩa là viết trong mã nguồn Java mà loại lý luận mất bất kỳ ý nghĩa. Cụ thể, trình biên dịch JIT sẽ làm cho mã của bạn trở nên khó hiểu ở mức mã máy.

+0

Vì vậy, nó không quan trọng trong trường hợp bạn viết nó, trình biên dịch làm cho nó vào thứ mà nó thuộc về? Tôi sẽ dạy cho các sinh viên của tôi điều này theo cách này, hậu trường và điều kiện tiên quyết là (nếu tôi là giáo viên), bởi vì điều này có một số "kiến thức nền", điều này luôn có thể thú vị. Nhưng nó thú vị, rằng nó không quan trọng. Thx, để bạn trả lời! :) – codepleb

+0

Trình biên dịch Just-in-Time của Java thực hiện rất nhiều điều phức tạp hơn mà hầu như thậm chí không nhập hình ảnh. Ví dụ, nó có thể xóa toàn bộ vòng lặp * của bạn nếu nó nhận ra nó không có tác dụng phụ. –

+0

Điều đó có thể đúng, nhưng logic lập trình sẽ phù hợp hơn, nếu tôi làm điều này theo cách "của tôi", tôi hiểu điều này. Tất nhiên, nó có thể không quan trọng, nhưng tại sao tôi không nên viết logic, trình biên dịch cũng sẽ viết? Dù sao thì, người anwser tốt, nhưng tôi sẽ không thay đổi những gì tôi làm vào lúc này. :) – codepleb