SORU
16 EKİM 2010, CUMARTESİ


Ne zaman memoization DZD Haskell otomatik mi?

M1 m2 görünüşe göre aşağıda ise memoized neden olduğunu çözemedim:

m1      = ((filter odd [1..]) !!)

m2 n    = ((filter odd [1..]) !! n)

m1 10000000 alır yaklaşık 1,5 saniye İlk Çağrı, bir kısmını bundan sonraki aramalar (tahminen önbelleğe liste) ise m2 10000000 her zaman alır aynı miktarda zaman (yeniden liste ile her arama). Herhangi bir fikir ne oluyor? DZD bir işlevi bugünkü ileri matematik ve ne zaman ulaşacağına olarak başparmak herhangi bir kural var mı? Teşekkürler.

CEVAP
16 EKİM 2010, CUMARTESİ


DZD fonksiyonları bugünkü ileri matematik değil.

Ancak, kodda herhangi bir ifade lambda ifade çevresi girilen bir kez saat başına en fazla, ya da daha üst düzeyde ise en fazla bir kez hesaplamak. Lambda ifadeleri yerini belirleme gibi örnek sözdizimsel şeker kullanımı, eşdeğer desugared sözdizimi dönüştürmek bakalım ne zaman biraz zor olabilir

m1' = (!!) (filter odd [1..])              -- NB: See below!
m2' = \n -> (!!) (filter odd [1..]) n

(Not: Haskell 98 rapor, aslında \b -> (%) a b eşdeğer (a %) gibi sol operatörlüğü bölümü açıklar ama DZD (%) a desugars. Bu seq ile ayırt edilebilir, çünkü teknik olarak farklı. Bu konuda DZD Trac bir bilet teslim olmuş olabilirim.)

Verilen bu, görüyorsun m1' ifade filter odd [1..] bulunan herhangi bir lambda ifade, yani tek olması hesaplanan bir kere başına çalışma programı, süre m2', filter odd [1..] olacaktır hesaplanan her zaman lambda-ifadesidir girdi, yani, her Ara m2'. Bu gördüğünüz zamanlama farkı açıklar.


Aslında, DZD bazı sürümleri, bazı optimizasyon seçenekleri ile, yukarıdaki açıklamalar gösteriyor daha değerleri paylaşacak. Bu bazı durumlarda sorunlu olabilir. Örneğin, işlevini düşünün

f = \x -> let y = [1..30000000] in foldl' ( ) 0 (y    [x])

DZD y x bağlı değildir dikkat edin ve fonksiyonlarını yeniden olabilir

f = let y = [1..30000000] in \x -> foldl' ( ) 0 (y    [x])

Bu durumda, yeni sürümü çok daha verimli olacaktır, çünkü okumak zorunda 1 GB hafıza nerede y saklanır, süre özgün sürüm vadede sürekli Uzay ve uyum işlemcinin önbelleği. DZD altında aslında 6.12.1, işlevi f derlenmiş, neredeyse iki kat daha hızlıolmadanbunu daha iyileştirmeleri -O2 ile derlendi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Engadget

    Engadget

    18 EYLÜL 2006
  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • Philip DeFranco

    Philip DeFra

    16 EYLÜL 2006