2011-03-21 20 views
9

CPU Ölçme süresi aşağıdaki gibi bir fonksiyonun işlemci süresini ölçmek için gereken:Haskell'in bir fonksiyonu

t <- getCPUTime 
res <- callTheFunction input 
t' <- getCPUTime 
print $ t' - t 

sorun Haskell tembellik gelir. callTheFunction kesinlikle değerlendirilmelidir. Ben çok arandı ve seq ve $ kullanmaya çalıştı! ama başarı olmadan. Bunun oldukça yaygın bir görev olduğunu düşünüyorum. Her neyse, biraz yardıma ihtiyacım var. Teşekkürler.

Güncelleme: Tüm yardımlarınız için teşekkürler, özellikle @FUZxxl. Bana WHNF (Zayıf Kafa Normal Formu) ve Normal Form arasındaki farkı hatırlatıyor. Haskell/Laziness Haskell'in tembel değerlendirmesini anlamaya yardımcı olur.

İhtiyacım olan şey bir adım adım değerlendirmedir. Neyse, $ veya her ikisi sürece sadece WHNF res için gereklidir işleri değerlendirmek:

t <- getCPUTime 
res <- callTheFunction input 
evaluate res OR return $! res 
t' <- getCPUTime 
print $ t' - t 
+1

Bu, sıkılık sorununuzu çözmez (bunun için değerlendirme yapın), ancak hızlı ve kirli zamanlamalar için (yani, ölçütden daha basit), timeIt paketini kullanabilirsiniz: http: //hackage.haskell. org/package/timeit – sclv

cevap

7

Kullanım Control.Exception gelen fonksiyon evaluate :: a -> IO a. İlgili IO-eylemi yürütüldüğünde argümanını WHNF'ye göre değerlendirir. Bununla birlikte, WHNF'nin işleviniz için yeterli olduğundan emin olmalısınız.

+0

WHNF'nin genellikle yeterli olmadığını unutmayın. Örnek olarak, bir listenin WHNF sadece ilk eksisidir. –

+0

Değerlendirmeyi ve zorlamayı birleştirebilirsiniz. – fuz

4

Kriterleri yapmaya çalışıyorsanız, lütfen Hackage'deki mükemmel kriter kütüphanesini kullanın.

8

Kıyaslama yapıyorsanız, Criterion'u kullanmalısınız. Aksi halde değerlendirmeyi zorlamak için NFData (rnf) ve bang patterns kullanın.

+0

Sorun, özellikle IO bağlamında, 'seq've' rnf' ifadesinin ifadeyi istenen dereceye göre değerlendirmek için yeterince güçlü olmadığıdır. – fuz

+0

@FUZxxl Ne yaptığınıza dair net değilim. Herhangi bir noktada (IO işleminden önce veya sonra) "NFData a => a" türünde bir değere sahipseniz, patlama modelleri ve "rnf" yeterli olmalıdır (çoğu durumda WHNF'den kesinlikle daha iyi). –

+0

Sadece bunu okudum. Oldukça emin değilim. – fuz