Thiết bị của Duff: unrolling cho các ngôn ngữ được dịch - 💡 Fix My Ideas

Thiết bị của Duff: unrolling cho các ngôn ngữ được dịch

Thiết bị của Duff: unrolling cho các ngôn ngữ được dịch


Tác Giả: Ethan Holmes, 2019

Vào năm 1983, Tom Duff đã phát minh ra một cách thực sự kỳ lạ để sử dụng bộ chuyển đổi ngôn ngữ C và các câu lệnh tình huống cho mã tối ưu hóa không kiểm soát các vòng lặp lớn. Ví dụ, ông đã mô tả một vòng lặp đơn giản sao chép một mảng vào một thanh ghi đầu ra:

gửi (đến, từ, đếm) đăng ký ngắn * đến, * từ; số lượng đăng ký; {làm * đến = * từ ++; while (- đếm> 0); }

Trên mỗi lần lặp của vòng lặp, ngoài bản sao đang được thực hiện, biến số đếm được giảm và so sánh được thực hiện so với 0. Thiết bị Duff cho phép bạn đạt được kết quả tương tự, nhưng chỉ với 8 trên không:

gửi (đến, từ, đếm) đăng ký ngắn * đến, * từ; số lượng đăng ký; {đăng ký n = (đếm + 7) / 8; chuyển đổi (đếm% 8) {trường hợp 0: do {* đến = * từ ++; trường hợp 7: * đến = * từ ++; trường hợp 6: * đến = * từ ++; trường hợp 5: * đến = * từ ++; trường hợp 4: * đến = * từ ++; trường hợp 3: * đến = * từ ++; trường hợp 2: * đến = * từ ++; trường hợp 1: * đến = * từ ++; } trong khi (- n> 0); }}

Điều xảy ra là vòng lặp không được kiểm soát 8 lần, vì vậy mỗi lần lặp của vòng lặp sẽ chạy mã nội bộ 8 lần mà không cần so sánh. Thiên tài của Duff Thiết bị là nó tận dụng lợi thế của cấu trúc chuyển đổi / trường hợp C hoạt động. Lần đầu tiên, nếu các lần lặp don don chia đều cho 8, mã vòng lặp được thực thi đủ số lần bằng với phần còn lại của các lần lặp / 8.Nó có một chút kỳ quái, bởi vì câu lệnh do do do xảy ra trong chuyển đổi, nhưng có những câu lệnh trường hợp vụng trộm trong trò chơi do do do. Tuy nhiên, nó hợp lệ C.

Trước khi ai đó khóc hôi, hãy nhớ rằng điều này chỉ thực sự phù hợp để tăng tốc hiệu suất của các vòng lặp bên trong khi không có thuật toán phù hợp, tốt hơn. Nếu bạn mã C, hầu hết các trình biên dịch hiện đại đủ thông minh để tự động tối ưu hóa mã của bạn và hủy bỏ các vòng lặp cho bạn.

Tuy nhiên, đối với các ngôn ngữ được dịch như PHP hoặc Javascript, đôi khi bạn cần tự tối ưu hóa một chút nếu bạn muốn giảm bớt một số hiệu suất bổ sung. May mắn thay, cả hai ngôn ngữ có một tuyên bố chuyển đổi kiểu c.

Andy King đã viết về một phiên bản thay đổi một chút của thuật toán hủy kiểm soát vòng lặp này, điều này đã bỏ câu lệnh chuyển đổi và chia Thiết bị Duff bình thường thành hai vòng riêng biệt, một cho phần còn lại và một cho việc không kiểm soát. Trong Javascript, nó thực hiện một vòng lặp bổ sung đơn giản chỉ trong một phần ba thời gian của vòng lặp for bình thường (testVal ++ là vòng lặp bên trong bình thường):

hàm duffFasterLoop8 (lặp) {var testVal = 0; var n = số lần lặp% 8; if (n> 0) {do {testVal ++; } trong khi (--n); // n phải lớn hơn 0 ở đây} n = parseInt (lặp / 8); làm {testVal ++; testVal ++; testVal ++; testVal ++; testVal ++; testVal ++; testVal ++; testVal ++; } trong khi (--n); }

Nó không thông minh về mặt cú pháp như Thiết bị Duff, nhưng nó là một cách tốt để tự hủy bỏ vòng lặp bên trong và có được hiệu suất tốt nhất cho nỗ lực thêm của bạn.

Thiết bị Duff từ trước Andy King bổ sung tối ưu hóa JavaScript cho tốc độ thực thi



BạN Có Thể Quan Tâm

i-SOBOT hack tài nguyên

i-SOBOT hack tài nguyên


Máy may: Roundup tầm trung

Máy may: Roundup tầm trung


Thủ công: Recipe - Easy Tres Leches Cake

Thủ công: Recipe - Easy Tres Leches Cake


Cuộc thi SPEAK VISUAL ™ tại Trạm sửa đổi NVIDIA® với MAKE

Cuộc thi SPEAK VISUAL ™ tại Trạm sửa đổi NVIDIA® với MAKE






Bài ViếT GầN Đây