Nếu something.awesome là trường , nó có khả năng truy cập mỗi lần vòng vòng vì thứ gì đó trong phần thân của vòng lặp có thể cập nhật. Nếu thân của vòng lặp đủ đơn giản và không gọi bất kỳ phương thức nào (ngoài các phương thức mà trình biên dịch inline), thì trình biên dịch có thể chứng minh rằng an toàn để đặt giá trị của something.awesome trong thanh ghi. Các nhà biên dịch được sử dụng để đi đến rất nhiều khả năng để làm điều này ngắn.
Tuy nhiên những ngày này phải mất một thời gian rất dài để truy cập một giá trị từ bộ nhớ chính, nhưng khi giá trị đã được đọc lần đầu tiên, nó được huấn luyện bởi CPU. Đọc giá trị lần thứ hai từ bộ nhớ cache CPU nhanh hơn rất nhiều so với tốc độ đọc nó từ một thanh ghi rồi đọc nó từ bộ nhớ chính. Bộ nhớ CPU nhanh hơn hàng trăm lần so với bộ nhớ chính.
Bây giờ nếu something.awesome là một tài sản , thì đó là phương thức thực hiện cuộc gọi phương thức. Trình biên dịch sẽ gọi phương thức mỗi lần vòng lặp. Tuy nhiên, nếu thuộc tính/phương thức chỉ là một vài dòng mã, nó có thể được inline biên dịch. Inlineing là khi trình biên dịch đặt một bản sao của mã phương thức trực tiếp thay vì gọi phương thức, do đó, một thuộc tính vừa trả về giá trị của một trường sẽ hoạt động giống như ví dụ trường ở trên.
Evan khi thuộc tính không được gạch chân, nó sẽ nằm trong bộ nhớ cache CPU sau khi nó được gọi là lần đầu tiên. Vì vậy, ales nó là rất phức tạp hoặc vòng lặp đi vòng nhiều lần phải mất rất nhiều thời gian để gọi lần đầu tiên vòng vòng, có thể bởi nhiều hơn một yếu tố của 10.
Trong những ngày cũ, it được sử dụng để dễ dàng bởi vì tất cả các truy cập bộ nhớ và hành động cpu mất cùng một lúc. Những ngày này bộ nhớ cache của bộ xử lý có thể dễ dàng thay đổi thời gian cho một số truy cập bộ nhớ và các cuộc gọi phương thức theo số trên hệ số 100. Profiler có xu hướng vẫn giả định rằng tất cả truy cập bộ nhớ đều mất thời gian! Vì vậy, nếu bạn hồ sơ, bạn sẽ được yêu cầu thực hiện các thay đổi có thể không có bất kỳ ảnh hưởng nào trong thế giới thực.
Thay đổi mã để:
int limit = something.awesome;
for(int i = 0; i < limit; i++)
{
// Do cool stuff
}
Will trong một số trường hợp lây lan nó lên, mà còn làm cho nó phức tạp hơn. Tuy nhiên
int limit = myArray.length;
for(int i = 0; i < limit; i++)
{
myArray[i[ = xyn;
}
là chậm hơn sau đó
for(int i = 0; i < myArray.length; i++)
{
myArray[i[ = xyn;
}
như .net kiểm tra các ràng buộc của mảng mỗi khi họ được truy cập và có logic để loại bỏ việc kiểm tra khi vòng lặp đơn giản là đủ.
Vì vậy, cách tốt nhất là giữ mã đơn giản và rõ ràng cho đến khi bạn có thể chứng minh có sự cố. Bạn kiếm được nhiều lợi ích hơn bằng cách dành thời gian của bạn để cải thiện thiết kế tổng thể của một hệ thống, điều này rất dễ làm nếu mã bạn bắt đầu với đơn giản.
Vâng, hãy thử nó với 'for (int i = 0; i <(i + 2); ++ i)';) – Dario
Chỉ cần sang một bên; có * là * một kịch bản mà JIT làm một cái gì đó thông minh ở đây; với mảng nó phát hiện trường hợp '
Hmm, tôi thực sự không tin tưởng JIT rất nhiều kể từ khi tôi đang phát triển trong XNA đó là một chút kỳ quặc trên 360. Không được unappreciative mặc dù, điều này có thể có ích cho các ứng dụng PC. :) – Vectovox