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 if
thử 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.