Ini sebenarnya adalah masalah mendalam yang memiliki beberapa jawaban metodis dan beberapa pragmatis. Saya berasumsi Anda ingin tahu sesuatu tentang algoritma yang ada. Jika Anda ingin tahu algoritma mana yang bekerja lebih baik pada mesin yang diberikan pada input yang diberikan, silakan dan mengukur runtimes. Jika Anda ingin membandingkan kualitas kompiler untuk algoritma yang diberikan, silakan dan mengukur runtimes. Untuk mempelajari sesuatu tentang algoritma, jangan lakukan itu.
Izinkan saya memberi beberapa alasan mengapa menggunakan runtimes bukan ide yang baik.
- Generality
Runtimes diukur menggunakan satu bahasa dan satu kompiler pada satu mesin memiliki sedikit arti jika Anda mengubah komponen apa pun. Bahkan implementasi yang sedikit berbeda dari algoritma yang sama dapat bekerja secara berbeda karena Anda memicu beberapa pengompilasi di dalam kasus tetapi tidak di yang lain.
- Prediksi
Jadi Anda memiliki beberapa runtime untuk beberapa input. Apa yang dikatakan tentang runtime dari beberapa input lain? Secara umum, tidak ada.
- Signifikansi
Biasanya, Anda tidak akan membandingkan semua input (dengan ukuran tertentu), sehingga segera membatasi kemampuan Anda untuk membandingkan algoritme: mungkin set pengujian Anda memicu kasus terburuk dalam satu dan kasus terbaik dalam algoritme lain? Atau mungkin input Anda terlalu kecil untuk menunjukkan perilaku runtime .
- Pengukuran
Mengukur runtime dengan baik tidak mudah. Apakah ada JIT? Apakah ada pertengkaran, yaitu apakah Anda menghitung waktu bahkan algoritma tidak berjalan? Bisakah Anda mereproduksi persis kondisi mesin yang sama untuk menjalankan lain (dari algoritma lain), khususnya proses dan cache bersamaan? Bagaimana latensi memori ditangani?
Saya harap ini meyakinkan Anda bahwa runtime adalah ukuran yang mengerikan untuk membandingkan algoritma, dan bahwa beberapa metode umum abstrak untuk menyelidiki runtime algoritma diperlukan.
Ke bagian kedua dari pertanyaan. Mengapa kita menggunakan perbandingan atau operasi dasar serupa?
Keterlacakan analitik
Dengan asumsi Anda ingin melakukan analisis formal, Anda harus dapat melakukannya. Menghitung pernyataan individual sangat teknis, terkadang bahkan sulit; beberapa orang tetap melakukannya (misalnya Knuth). Menghitung hanya beberapa pernyataan - yang mendominasi runtime - lebih mudah. Untuk alasan yang sama, kita sering "hanya" menyelidiki (batas atas) runtime terburuk.
Dominasi
Operasi yang dipilih mendominasi runtime. Itu tidak berarti bahwa ia berkontribusi paling runtime - perbandingan jelas tidak, misalnya di Quicksort ketika mengurutkan integer berukuran kata. Tetapi mereka dieksekusi paling sering , jadi dengan menghitungnya Anda menghitung seberapa sering bagian algoritma yang paling dieksekusi dijalankan. Akibatnya, runtime asimptotik Anda sebanding dengan jumlah operasi dasar yang dominan. Inilah sebabnya kami merasa nyaman menggunakan notasi Landau dan kata "runtime" walaupun kami hanya menghitung perbandingan.
Perhatikan bahwa dapat berguna untuk menghitung lebih dari satu operasi. Sebagai contoh, beberapa varian Quicksort mengambil lebih banyak perbandingan tetapi lebih sedikit pertukaran daripada yang lain (rata-rata).
Untuk apa nilainya, setelah Anda melakukan semua teori yang Anda mungkin ingin meninjau kembali runtimes untuk memverifikasi bahwa prediksi yang dibuat teori Anda masuk akal. Jika tidak, teori Anda tidak berguna (dalam praktiknya) dan harus diperpanjang. Hirarki memori adalah salah satu hal pertama yang Anda sadari penting tetapi tidak ada dalam analisis dasar.