Thông thường tôi ghét từ "tối ưu hóa sớm", nhưng đây là sự xuất hiện của nó. Điều đáng chú ý là Knuth đã sử dụng câu nói nổi tiếng này trong bối cảnh thúc đẩy sử dụng các goto
câu lệnh để tăng tốc mã trong các khu vực quan trọng . Đó là chìa khóa: những con đường quan trọng .
Ông đã đề nghị sử dụng goto
để tăng tốc mã nhưng cảnh báo chống lại những lập trình viên muốn thực hiện những loại việc này dựa trên linh cảm và mê tín đối với mã thậm chí không quan trọng.
Để ủng hộ switch
tuyên bố càng nhiều càng tốt thống nhất trong suốt một codebase (có hay không có tải nặng được xử lý) là ví dụ điển hình về những gì Knuth gọi là "xu-khôn ngoan và lb-ngu ngốc" lập trình viên người dành cả ngày phải vật lộn để duy trì họ "tối ưu hóa "Mã biến thành cơn ác mộng gỡ lỗi là kết quả của việc cố gắng tiết kiệm đồng xu hơn bảng Anh. Mã như vậy hiếm khi có thể được duy trì, ngay cả khi hiệu quả ngay từ đầu.
Anh ấy có đúng không?
Ông là chính xác từ quan điểm hiệu quả rất cơ bản. Không có trình biên dịch theo kiến thức của tôi có thể tối ưu hóa mã đa hình liên quan đến các đối tượng và công văn động tốt hơn một câu lệnh chuyển đổi. Bạn sẽ không bao giờ kết thúc với bảng LUT hoặc nhảy sang mã được in từ mã đa hình, vì mã đó có xu hướng đóng vai trò là rào cản tối ưu hóa cho trình biên dịch (nó sẽ không biết nên gọi hàm nào cho đến thời điểm mà công văn động xảy ra).
Sẽ hữu ích hơn khi không nghĩ về chi phí này về mặt bảng nhảy mà nhiều hơn về hàng rào tối ưu hóa. Đối với đa hình, việc gọi Base.method()
không cho phép trình biên dịch biết chức năng nào thực sự sẽ được gọi nếu method
là ảo, không bị niêm phong và có thể bị ghi đè. Vì nó không biết chức năng nào thực sự sẽ được gọi trước, nên nó không thể tối ưu hóa cuộc gọi chức năng và sử dụng nhiều thông tin hơn trong việc đưa ra quyết định tối ưu hóa, vì thực tế nó không biết chức năng nào sẽ được gọi tại thời gian mã đang được biên dịch.
Tối ưu hóa là tốt nhất khi họ có thể tham gia vào một cuộc gọi chức năng và thực hiện tối ưu hóa hoàn toàn làm phẳng người gọi và callee, hoặc ít nhất là tối ưu hóa người gọi để làm việc hiệu quả nhất với callee. Họ không thể làm điều đó nếu họ không biết chức năng nào thực sự sẽ được gọi trước.
Có phải anh ta chỉ nói ra mông của mình?
Sử dụng chi phí này, thường là đồng xu, để biện minh cho việc biến điều này thành một tiêu chuẩn mã hóa được áp dụng thống nhất nói chung là rất ngu ngốc, đặc biệt là đối với những nơi có nhu cầu mở rộng. Đó là điều chính bạn muốn đề phòng với các trình tối ưu hóa sớm chính hãng: họ muốn biến các mối quan tâm hiệu suất nhỏ thành các tiêu chuẩn mã hóa được áp dụng thống nhất trong toàn bộ một cơ sở mã hóa mà không liên quan đến khả năng bảo trì.
Mặc dù vậy, tôi có một chút xúc phạm đến trích dẫn của "hacker C cũ" được sử dụng trong câu trả lời được chấp nhận, vì tôi là một trong số đó. Không phải tất cả mọi người đã mã hóa trong nhiều thập kỷ bắt đầu từ phần cứng rất hạn chế đã biến thành một trình tối ưu hóa sớm. Nhưng tôi cũng đã gặp và làm việc với những người đó. Nhưng những kiểu đó không bao giờ đo lường được những thứ như hiểu sai về chi nhánh hoặc lỗi bộ nhớ cache, họ nghĩ rằng họ biết rõ hơn và dựa trên những quan niệm không hiệu quả của họ trong một cơ sở sản xuất phức tạp dựa trên những mê tín ngày nay không đúng và đôi khi không bao giờ đúng. Những người đã thực sự làm việc trong các lĩnh vực quan trọng về hiệu suất thường hiểu rằng tối ưu hóa hiệu quả là ưu tiên hiệu quả và cố gắng khái quát hóa một tiêu chuẩn mã hóa làm giảm khả năng duy trì để tiết kiệm xu là rất ưu tiên.
Các nhãn hiệu rất quan trọng khi bạn có một chức năng giá rẻ mà không thực hiện quá nhiều công việc được gọi là một tỷ lần trong một vòng lặp rất quan trọng, hiệu suất. Trong trường hợp đó, chúng tôi cuối cùng đã tiết kiệm được 10 triệu đô la. Nó không đáng để cạo râu khi bạn có một chức năng được gọi là hai lần mà một mình cơ thể có giá hàng ngàn đô la. Sẽ không khôn ngoan khi bạn dành thời gian mặc cả những đồng xu trong quá trình mua xe. Thật đáng để mặc cả đồng xu nếu bạn mua một triệu lon soda từ nhà sản xuất. Chìa khóa để tối ưu hóa hiệu quả là hiểu những chi phí này trong bối cảnh thích hợp của chúng. Một người nào đó cố gắng tiết kiệm từng đồng xu cho mỗi lần mua và đề nghị mọi người khác cố gắng mặc cả đồng xu cho dù họ mua gì không phải là một trình tối ưu hóa có kỹ năng.