Yêu cầu tham khảo: tối ưu hóa quy trình trên danh sách bằng các ngôn ngữ động bằng cách thực hiện kiểm tra an toàn trước


7

Đối với dự án hội chợ khoa học của mình, tôi đã triển khai tối ưu hóa cho thói quen sắp xếp của Python. Ý tưởng là để di chuyển các kiểm tra an toàn phải được thực hiện trong mỗi lần so sánh, ví dụ kiểm tra loại và kiểm tra độ rộng ký tự, bên ngoài vòng lặp sắp xếp và chỉ cần thực hiện tất cả trong một lần. Sau đó, một chức năng so sánh được tối ưu hóa được chọn từ danh mục đầu tư dựa trên kết quả kiểm tra. Vì vậy, ví dụ, nếu các kiểm tra xác định rằng tất cả các đối tượng cùng loại, chức năng so sánh được chọn có thể bỏ qua kiểm tra thường được yêu cầu "là các loại đối tượng tương thích". Vân vân.

Tôi phải viết nó lên như một bài báo, và hiện đang làm một bài phê bình văn học. Có bài báo nào mô tả các kỹ thuật tương tự trong các ngôn ngữ động khác / nói chung không?


2
Mặc dù điều này không liên quan trực tiếp, nhưng hy vọng nó có thể giúp chỉ cho bạn những hướng hữu ích. Điều này phần nào gợi nhớ đến bộ nhớ đệm nội tuyến cho nhiều trình biên dịch JIT / động. Ý tưởng là để hồ sơ các dấu vết có khả năng "nóng" vào các nhóm được lập chỉ mục bởi các thuộc tính của chúng (ví dụ: danh sách các số nguyên, danh sách các chuỗi, danh sách hỗn hợp, v.v.). Với các nhóm này, sau đó chúng tôi tự động tạo mã được tối ưu hóa cho từng bộ thuộc tính và lưu trữ chúng theo bộ đệm. Kết quả là, tài liệu đúng lúc chứa khá nhiều tối ưu hóa mà ít nhiều phù hợp với khuôn của bạn. Chúc bạn tham khảo-săn bắn!
Lee

1
@LeeGao Nghe có vẻ giống hệt như những gì tôi đang làm, ngoại trừ các dấu vết "nóng" được mã hóa cứng và chúng tôi không tự động tạo ra bất cứ thứ gì ngoài việc mã hóa các dấu vết được tối ưu hóa; một giấy khảo sát tốt / giấy mốc cho kỹ thuật này là gì? Tôi đã thử googling "xô JIT" nhưng không thể tìm thấy bất cứ thứ gì :)
Elliot Gorokhovsky

1
"Bộ nhớ đệm nội tuyến" sẽ cho bạn một vài kết quả tốt. "Xô" chỉ là một từ tôi sử dụng bất cứ khi nào tôi cố gắng giải thích nó với bạn bè và đồng nghiệp. : P
Lee

@LeeGao :) Ya, cảm ơn. Bây giờ tôi thấy rằng những gì tôi đang làm chính xác là bộ nhớ đệm nội tuyến là gì. Tốt để biết!
Elliot Gorokhovsky

Câu trả lời:


7

Tôi không nhận thức được bất cứ điều gì chính xác như thế này, nhưng có một số điều có liên quan.

Để sắp xếp cụ thể, điều này có liên quan đến biến đổi Schwartzian , mặc dù với một mục tiêu rất khác. Trong biến đổi Schwartzian, bạn chạy qua đầu vào áp dụng một hàm đắt tiền và ghép nối đầu vào và đầu ra với nhau, sau đó sắp xếp theo đầu ra. Điều này trái ngược với việc thực hiện chức năng đắt tiền đó trên mỗi hoạt động. Trong trường hợp của bạn, "hàm đắt tiền" của bạn sẽ là loại kiểm tra và công văn động . Một chút khác biệt bạn cũng sẽ kiểm tra một thuộc tính cho toàn bộ danh sách và sau đó chọn sử dụng thao tác so sánh nào dựa trên đó.

Trong một mạch hoàn toàn khác, có một kỹ thuật chung gọi là bộ nhớ đệm nội tuyến đa hình (được tiên phong bởi nhóm Tự và được đề cập, trong số nhiều thứ khác, trong luận án của Craig Chamber ) và tối ưu hóa thích ứng nói chung được sử dụng trong một số máy ảo. Bộ nhớ đệm nội tuyến đa hình giải quyết vấn đề là nếu chúng ta thực hiện một công văn động, thì chúng ta sẽ chuyển sang một số mã hoàn toàn không xác định, và do đó chúng ta không thể nội tuyến nó và tối ưu hóa nó và chức năng hiện tại. Giải pháp rất đơn giản: chỉ cần thực hiện một ifthử nghiệm nếu chúng ta đang ở trong một số trường hợp cụ thể và nếu vậy, chúng ta có thể nội tuyến mã đó, nếu không chúng ta sẽ thực hiện công văn động. Vấn đề là có một số lượng không xác định, không rõ các trường hợp có thể xảy ra. Đây không phải là một vấn đề, mặc dù, cho mộtTrình biên dịch Just-In-Time (JIT) có thể thực hiện điều này cho các trường hợp thực sự nhìn thấy trong thời gian chạy.

Điều này không giải quyết được vấn đề của bạn vì công văn động dựa trên lớp thời gian chạy của một đối tượng, không dựa trên một số vị từ tùy ý như "tất cả các phần tử của mảng này có cùng loại". Đây là nơi tối ưu hóa thích ứng xuất hiện và những thứ như truy tìm trình biên dịch JIT. Một điều khá dễ hiểu là việc không kiểm soát một vòng lặp một vài lần hoặc đưa vào một vài mức đệ quy có thể dẫn đến nhiều kiểm tra loại bị loại bỏ với tối ưu hóa kiểu truyền liên tục đơn giản và có thể được loại bỏ hoàn toàn bằng cách tối ưu hóa tinh vi hơn trong một số trường hợp. Tuy nhiên, nó thường sẽ không làm điều tương tự như bạn đang đề xuất và trước tiên sẽ cần phải xem dấu vết cho mỗi lần sử dụng hàm sắp xếp. Mặt khác, nếu nó biết tất cả các yếu tố là số, giả sử, từ mã trước đó, nó có thể loại bỏ việc kiểm tra hoàn toàn.


Trên thực tế, bộ nhớ đệm nội tuyến đa hình rất phù hợp, bởi vì tôi có rất nhiều hàm so sánh trường hợp đặc biệt (như đối với chuỗi, int và float) được nội tuyến. Mã của tôi đi qua và kiểm tra các trường hợp đặc biệt đó và nếu tìm thấy một trường hợp, nó sẽ thay thế hàm so sánh bằng một trường hợp đặc biệt.
Elliot Gorokhovsky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.