Ok, trước hết, tôi không biết cách trình biên dịch tự động thực hiện như thế nào. Và tôi khá chắc chắn có ít nhất 10s nếu không phải 100s thuật toán mà trình biên dịch phải chọn.
Và có thể là trình biên dịch cụ thể.
Nhưng, tôi có thể giúp bạn tính toán hiệu quả của nó.
Chỉ cần lưu ý rằng kỹ thuật này thường không mang đến cho bạn hiệu suất tuyệt vời.
Nhưng tính toán lặp lại lặp lại và có thể cho hiệu suất phần trăm cao.
Điều này là do thường là hàm bên trong vòng lặp mất nhiều thời gian tính toán hơn kiểm tra điều kiện của vòng lặp.
Vì vậy, cho phép nói rằng chúng ta có một vòng lặp đơn giản với một hằng số, vì bạn đã quá lười biếng để làm copy-paste hoặc chỉ nghĩ nó sẽ trông tốt hơn:
for (int i = 0; i < 5; i++)
{
DoSomething();
}
Ở đây bạn có int so sánh , 5 số gia tăng và Cuộc gọi DoSomethig().
Vì vậy, nếu DoSomething() tương đối nhanh, thì chúng tôi có các hoạt động .
Bây giờ nếu bạn sẽ cuộn này, bạn sẽ giảm nó xuống chỉ còn 5 hoạt động:
DoSomething();
DoSomething();
DoSomething();
DoSomething();
DoSomething();
Bây giờ với các hằng số đó là dễ dàng hơn, vì vậy cho phép xem làm thế nào nó sẽ làm việc với một biến:
for (int i = 0; i < n; i++)
{
DoSomething();
}
Ở đây bạn có n int so sánh, n incrementations, và n DoSomethig() gọi = 3n. Bây giờ, chúng ta không thể cuộn nó hoàn toàn, nhưng chúng ta có thể cuộn nó bằng một yếu tố không đổi (cao hơn n dự kiến sẽ được, chúng ta càng nên cuộn nó):
int i;
for (i = 0; i < n; i = i+3)
{
DoSomething();
DoSomething();
DoSomething();
}
if (i - n == 2)
{
DoSomething(); // We passed n by to, so there's one more left
}
else if (i - n == 1)
{
DoSomething(); //We passed n by only 1, so there's two more left
DoSomething();
}
Bây giờ đây chúng tôi có Ở đây bạn có n/3 + 2 int so sánh, n/3 incrementations, và n DoSomethig() gọi = (1 2/3) * n.
Chúng tôi đã lưu chính mình (1 1/3) * n hoạt động. Điều này làm giảm thời gian tính toán gần một nửa.
FYI, một kỹ thuật đánh dấu gọn gàng khác được gọi là Duff's device.
Nhưng đó là trình biên dịch và ngôn ngữ thực hiện cụ thể. Có những ngôn ngữ mà điều này sẽ thực sự tồi tệ hơn.
Bạn đang tìm kiếm một bài báo về phân tích tối ưu hóa trình biên dịch? :) – Jon
Tôi muốn thêm: tại sao thông báo trợ giúp của gcc cho biết -funroll-all-loops thực sự làm cho chương trình chạy chậm hơn? Trích dẫn: "Thực hiện tối ưu hóa việc bỏ vòng lặp. Điều này được thực hiện cho tất cả các vòng lặp và thường làm cho các chương trình chạy chậm hơn." – BlackBear
@Jon, nó không quan trọng, tôi chỉ cần một câu trả lời tốt. –