Bu aslında bazı metodik ve pragmatik cevapları olan derin bir konudur. Eldeki algoritma (lar) hakkında bir şeyler bilmek istediğinizi varsayıyorum . Belirli girdilerde belirli bir makinede hangi algoritmanın daha iyi çalıştığını bilmek istiyorsanız, devam edin ve çalışma zamanlarını ölçün. Belirli bir algoritma için bir derleyicinin kalitesini karşılaştırmak istiyorsanız, devam edin ve çalışma zamanlarını ölçün. Algoritma hakkında bir şeyler öğrenmek için yapma.
Önce çalışma zamanlarının kullanılmasının iyi bir fikir olmadığına dair bazı nedenler vereyim.
- Genel
Bir makinede bir dil ve bir derleyici kullanılarak ölçülen çalışma zamanlarının herhangi bir bileşeni değiştirirseniz çok az anlamı vardır. Aynı algoritmanın biraz farklı uygulamaları bile farklı performans gösterebilir, çünkü durumda derleyici optimizasyonunu tetiklersiniz, diğerinde değil.
- Tahmin
Bazı girdiler için birkaç çalışma süreniz var. Bu, başka bir girdinin çalışma zamanı hakkında ne anlatıyor? Genel olarak, hiçbir şey.
- Önem
Genellikle, tüm girişleri (bazı boyutlarda) karşılaştırmazsınız, böylece algoritmaları karşılaştırma yeteneğinizi hemen kısıtlar: belki test setiniz birindeki en kötü durumu ve diğer algoritmada en iyi durumu tetikledi? Veya girişleriniz çalışma zamanı davranışını gösteremeyecek kadar küçük olabilir .
- Ölçüm
Ölçüm runtimes iyi önemsiz değil. JIT var mı? Çekişme oldu mu, yani algoritmanın çalışmadığı zamanı sayıyor musunuz? Aynı makine durumunu başka bir çalışma için (diğer algoritmanın), özellikle de eşzamanlı işlemler ve önbellekler için çoğaltabilir misiniz? Bellek gecikmesi nasıl ele alınır?
Umarım bunlar sizi çalışma zamanlarının algoritmaları karşılaştırmak için korkunç bir ölçü olduğuna ve algoritma çalışma zamanını araştırmak için bazı genel, soyut bir yönteme ihtiyaç olduğuna ikna etti.
Sorunun ikinci kısmına geçelim. Neden karşılaştırmaları veya benzer temel işlemleri kullanıyoruz?
Analitik
izlenebilirlik Resmi analiz yapmak istediğinizi varsayarsak, bunu yapabilmeniz gerekir. Bireysel ifadelerin sayılması çok teknik, hatta bazen zor; yine de bazı insanlar bunu yapar (örneğin Knuth). Sadece bazı ifadeleri saymak - çalışma zamanına hâkim olanlar - daha kolaydır. Aynı nedenden ötürü, en kötü durum çalışma zamanını genellikle "sadece" araştırıyoruz (üst sınırlar açık).
Hakimiyet
Seçilen işlem , çalışma zamanına hakimdir . Bu, en fazla çalışma süresine katkıda bulunduğu anlamına gelmez - karşılaştırmalar, örneğin kelime boyutlu tamsayıları sıralarken Quicksort'ta açıkça görülmez. Ancak bunlar en sık yürütülür , bu nedenle onları sayarak algoritmanın en çok çalıştırılan bölümlerinin ne sıklıkta çalıştırıldığını sayarsınız. Sonuç olarak, asimptotik çalışma süreniz baskın temel işlemlerin sayısı ile orantılıdır. Bu yüzden sadece karşılaştırmaları saymamıza rağmen Landau notasyonunu ve "çalışma zamanı" kelimesini kullanmakta rahatız.
Birden fazla işlem saymanın yararlı olabileceğini unutmayın. Örneğin, bazı Quicksort varyantları diğerlerinden daha fazla karşılaştırma yapar, ancak daha az takas alır (ortalama olarak).
Değer için, tüm teoriyi yaptıktan sonra, teorinizin yaptığı tahminlerin doğru olduğunu doğrulamak için çalışma zamanlarını tekrar gözden geçirmek isteyebilirsiniz. Eğer değillerse, teoriniz yararlı değildir (uygulamada) ve genişletilmesi gerekir. Bellek hiyerarşisi, temel analizlerde önemli ancak eksik olduğunu fark ettiğiniz ilk şeylerden biridir.