Tôi thường thấy trích dẫn này được sử dụng để biện minh cho mã hoặc mã rõ ràng là xấu, trong khi hiệu suất của nó chưa được đo lường, có thể được thực hiện nhanh hơn khá dễ dàng, mà không làm tăng kích thước mã hoặc ảnh hưởng đến khả năng đọc của nó.
Nói chung, tôi nghĩ rằng tối ưu hóa vi mô sớm có thể là một ý tưởng tồi. Tuy nhiên, tối ưu hóa vĩ mô (những thứ như chọn thuật toán O (log N) thay vì O (N ^ 2)) thường đáng giá và nên được thực hiện sớm, vì có thể lãng phí khi viết thuật toán O (N ^ 2) và sau đó ném nó đi hoàn toàn theo hướng tiếp cận O (log N).
Lưu ý các từ có thể là : nếu thuật toán O (N ^ 2) đơn giản và dễ viết, bạn có thể vứt nó đi sau mà không cảm thấy tội lỗi nếu nó trở nên quá chậm. Nhưng nếu cả hai thuật toán đều phức tạp tương tự nhau hoặc nếu khối lượng công việc dự kiến quá lớn mà bạn đã biết bạn sẽ cần nhanh hơn, thì tối ưu hóa sớm là một quyết định kỹ thuật âm thanh sẽ giảm tổng khối lượng công việc của bạn trong thời gian dài.
Vì vậy, nói chung, tôi nghĩ cách tiếp cận phù hợp là tìm hiểu các tùy chọn của bạn là gì trước khi bạn bắt đầu viết mã và có ý thức chọn thuật toán tốt nhất cho tình huống của bạn. Quan trọng nhất, cụm từ "tối ưu hóa sớm là gốc rễ của mọi tội lỗi" không phải là lý do cho sự thiếu hiểu biết. Các nhà phát triển nghề nghiệp nên có một ý tưởng chung về chi phí cho các hoạt động phổ biến; họ nên biết, ví dụ,
- chuỗi đó có giá cao hơn số
- các ngôn ngữ động chậm hơn nhiều so với các ngôn ngữ gõ tĩnh
- những lợi thế của danh sách mảng / vector so với danh sách được liên kết và ngược lại
- khi nào sử dụng hashtable, khi nào sử dụng bản đồ được sắp xếp và khi nào sử dụng heap
- rằng (nếu chúng hoạt động với thiết bị di động) "double" và "int" có hiệu suất tương tự trên máy tính để bàn (FP thậm chí có thể nhanh hơn) nhưng "double" có thể chậm hơn hàng trăm lần trên các thiết bị di động cấp thấp không có FPU;
- việc truyền dữ liệu qua internet chậm hơn so với truy cập ổ cứng, ổ cứng chậm hơn RAM rất nhiều, RAM chậm hơn nhiều so với bộ nhớ cache và đăng ký L1 và các hoạt động internet có thể chặn vô thời hạn (và thất bại bất cứ lúc nào).
Và các nhà phát triển nên làm quen với một hộp công cụ cấu trúc dữ liệu và thuật toán để họ có thể dễ dàng sử dụng các công cụ phù hợp cho công việc.
Có nhiều kiến thức và hộp công cụ cá nhân cho phép bạn tối ưu hóa gần như dễ dàng. Đặt nhiều nỗ lực vào một tối ưu hóa có thể không cần thiết là xấu xa (và tôi thừa nhận đã rơi vào cái bẫy đó hơn một lần). Nhưng khi tối ưu hóa dễ dàng như chọn một tập hợp / hàm băm thay vì một mảng hoặc lưu trữ một danh sách các số thành hai [] thay vì chuỗi [], thì tại sao không? Tôi có thể không đồng ý với Knuth ở đây, tôi không chắc, nhưng tôi nghĩ anh ta đang nói về tối ưu hóa cấp thấp trong khi tôi đang nói về tối ưu hóa cấp cao.
Hãy nhớ rằng, trích dẫn đó có nguồn gốc từ năm 1974. Vào năm 1974, máy tính hoạt động chậm và sức mạnh tính toán đắt đỏ, điều này khiến một số nhà phát triển có xu hướng tối đa hóa quá mức, từng dòng một. Tôi nghĩ đó là những gì Knuth đang chống lại. Anh ấy đã không nói "đừng lo lắng về hiệu suất", bởi vì vào năm 1974, đó sẽ chỉ là một cuộc nói chuyện điên rồ. Knuth đang giải thích cách tối ưu hóa; Nói tóm lại, người ta chỉ nên tập trung vào các nút thắt cổ chai, và trước khi bạn làm điều đó, bạn phải thực hiện các phép đo để tìm ra các nút thắt cổ chai.
Lưu ý rằng bạn không thể tìm thấy các nút cổ chai cho đến khi bạn đã viết một chương trình để đo lường, điều đó có nghĩa là một số quyết định về hiệu suất phải được đưa ra trước khi có bất cứ điều gì tồn tại để đo lường. Đôi khi những quyết định này rất khó thay đổi nếu bạn hiểu sai. Vì lý do này, thật tốt khi có một ý tưởng chung về những thứ chi phí để bạn có thể đưa ra quyết định hợp lý khi không có dữ liệu cứng.
Làm thế nào sớm để tối ưu hóa, và bao nhiêu lo lắng về hiệu suất phụ thuộc vào công việc. Khi viết các kịch bản mà bạn sẽ chỉ chạy một vài lần, lo lắng về hiệu suất hoàn toàn thường là một sự lãng phí hoàn toàn thời gian. Nhưng nếu bạn làm việc cho Microsoft hoặc Oracle và bạn đang làm việc trên một thư viện mà hàng ngàn nhà phát triển khác sẽ sử dụng theo hàng ngàn cách khác nhau, bạn có thể trả tiền để tối ưu hóa địa ngục, để bạn có thể bao quát tất cả sự đa dạng trường hợp sử dụng hiệu quả. Mặc dù vậy, nhu cầu về hiệu suất phải luôn được cân bằng với nhu cầu về khả năng đọc, duy trì, thanh lịch, mở rộng, v.v.