Saya sering melihat kutipan ini digunakan untuk membenarkan kode yang jelas buruk atau kode yang, meskipun kinerjanya belum diukur, mungkin dapat dibuat lebih cepat dengan mudah, tanpa meningkatkan ukuran kode atau mengurangi keterbacaannya.
Secara umum, saya pikir optimasi mikro awal mungkin merupakan ide yang buruk. Namun, optimasi makro (hal-hal seperti memilih algoritma O (log N) daripada O (N ^ 2)) sering bermanfaat dan harus dilakukan lebih awal, karena mungkin boros untuk menulis algoritma O (N ^ 2) dan kemudian buang sepenuhnya demi pendekatan O (log N).
Perhatikan kata-kata mungkin : jika O (N ^ 2) algoritma sederhana dan mudah untuk menulis, Anda bisa membuangnya kemudian tanpa banyak rasa bersalah jika ternyata menjadi terlalu lambat. Tetapi jika kedua algoritma itu sama kompleksnya, atau jika beban kerja yang diharapkan begitu besar sehingga Anda sudah tahu Anda akan membutuhkan yang lebih cepat, maka mengoptimalkan lebih awal adalah keputusan rekayasa suara yang akan mengurangi total beban kerja Anda dalam jangka panjang.
Jadi, secara umum, saya pikir pendekatan yang tepat adalah untuk mengetahui apa pilihan Anda sebelum Anda mulai menulis kode, dan secara sadar memilih algoritma terbaik untuk situasi Anda. Yang paling penting, ungkapan "optimisasi prematur adalah akar dari semua kejahatan" bukanlah alasan untuk ketidaktahuan. Pengembang karir harus memiliki gagasan umum tentang berapa biaya operasi umum; mereka harus tahu, misalnya,
- string itu harganya lebih mahal dari angka
- bahwa bahasa dinamis jauh lebih lambat daripada bahasa yang diketik secara statis
- keuntungan dari array / daftar vektor lebih dari daftar yang ditautkan, dan sebaliknya
- kapan harus menggunakan hashtable, kapan harus menggunakan peta yang diurutkan, dan kapan harus menggunakan heap
- bahwa (jika mereka bekerja dengan perangkat seluler) "ganda" dan "int" memiliki kinerja serupa di desktop (FP bahkan mungkin lebih cepat) tetapi "ganda" mungkin seratus kali lebih lambat pada perangkat seluler kelas bawah tanpa FPU;
- bahwa mentransfer data melalui internet lebih lambat daripada akses HDD, HDD jauh lebih lambat dari RAM, RAM jauh lebih lambat dari cache L1 dan register, dan operasi internet dapat memblokir tanpa batas waktu (dan gagal kapan saja).
Dan pengembang harus terbiasa dengan kotak peralatan struktur data dan algoritma sehingga mereka dapat dengan mudah menggunakan alat yang tepat untuk pekerjaan itu.
Memiliki banyak pengetahuan dan kotak peralatan pribadi memungkinkan Anda untuk mengoptimalkan hampir dengan mudah. Menempatkan banyak upaya ke dalam optimasi yang mungkin tidak perlu adalah kejahatan (dan saya akui jatuh ke dalam perangkap itu lebih dari sekali). Tetapi ketika optimasi semudah memilih set / hashtable alih-alih array, atau menyimpan daftar angka dalam double [] bukannya string [], lalu mengapa tidak? Saya mungkin tidak setuju dengan Knuth di sini, saya tidak yakin, tapi saya pikir dia berbicara tentang optimasi tingkat rendah sedangkan saya berbicara tentang optimasi tingkat tinggi.
Ingat, kutipan itu awalnya dari 1974. Pada 1974 komputer lambat dan daya komputasi mahal, yang memberi beberapa pengembang kecenderungan untuk terlalu mengoptimalkan, baris demi baris. Saya pikir itulah yang mendorong Knuth. Dia tidak mengatakan "jangan khawatir tentang kinerja sama sekali", karena pada tahun 1974 itu hanya akan menjadi pembicaraan gila. Knuth menjelaskan cara mengoptimalkan; singkatnya, seseorang harus fokus hanya pada kemacetan, dan sebelum Anda melakukannya, Anda harus melakukan pengukuran untuk menemukan kemacetan.
Perhatikan bahwa Anda tidak dapat menemukan hambatan sampai Anda menulis program untuk diukur, yang berarti bahwa beberapa keputusan kinerja harus dibuat sebelum segala sesuatu ada untuk diukur. Terkadang keputusan ini sulit diubah jika Anda salah. Untuk alasan ini, ada baiknya memiliki gagasan umum tentang biaya apa saja sehingga Anda dapat membuat keputusan yang masuk akal ketika tidak ada data keras yang tersedia.
Seberapa dini untuk mengoptimalkan, dan seberapa besar kekhawatiran tentang kinerja tergantung pada pekerjaan. Saat menulis skrip yang hanya akan Anda jalankan beberapa kali, mengkhawatirkan kinerja sama sekali biasanya hanya membuang waktu. Tetapi jika Anda bekerja untuk Microsoft atau Oracle dan Anda sedang bekerja di perpustakaan yang akan digunakan oleh ribuan pengembang lain dalam ribuan cara yang berbeda, mungkin perlu untuk mengoptimalkannya, sehingga Anda dapat mencakup semua yang beragam menggunakan kasing secara efisien. Meski begitu, kebutuhan akan kinerja harus selalu diimbangi dengan kebutuhan akan keterbacaan, pemeliharaan, keanggunan, ekstensibilitas, dan sebagainya.