Merak karma tablosu etkinliği | Netgez.com
SORU
17 HAZÄ°RAN 2010, PERÅžEMBE


Merak karma tablosu etkinliÄŸi

Haskell karma tabloları performans sorunları (2009 a blog) olduğunu okudum, ve Haskell gibi beni endişelendirdi. Bu bir yıl önceydi, şimdi durum (Haziran 2010) nedir? "Tablo sorunu" DZD sabit? karma var

CEVAP
17 HAZÄ°RAN 2010, PERÅžEMBE


Sorun çöp toplayıcı iÅŸaretçiler traverse deÄŸiÅŸken dizileri için gerekli olan ("kutulu diziler") ayırması için hazır olabilir veri iÅŸaretçileri arıyor. Kutulu, deÄŸiÅŸken diziler bir karma tablosu uygulamak için temel mekanizma, belirli bir yapısı GC geçiÅŸi sorunu ortaya çıktı. Bu birçok dilde ortaktır. Belirtisidir aşırı çöp toplama (GC saat harcanan zaman •'e kadar).

Düzeltme 17 ** geç 2009 yılında meydana gelen göstericiler, değişken dizileri için. Haskell, işaretçileri değişken diziler şimdi kullanırken aşırı GC görmesinler. Basit kriterler üzerinde, büyük karma için karma tablo ekleme 10x tarafından geliştirilmiş.

GC yürüme sorunu ne Kutusuz diziler purely functional structures, (Haskell parallel arrays vector-gibi diziler en çok veri gibi. etkilemez unutmayın Ne hashtables C yığında saklı (judy gibi) etkiler. Etkilemedi yani günlük zorunlu hash tabloları kullanarak değil Haskellers.

Eğer Haskell içinde hashtables kullanıyorsanız, herhangi bir sorun, şimdi incelemek gerekir. Burada, örneğin, bir karma 10 milyon değer vermez karma tablo ekler basit bir program. Orijinal alıntı herhangi bir kod veya kriterler mevcut olmadığından kıyaslama yaparım.

import Control.Monad
import qualified Data.HashTable as H
import System.Environment

main = do
  [size] <- fmap (fmap read) getArgs
  m <- H.new (==) H.hashInt
  forM_ [1..size] $ \n -> H.insert m n n
  v <- H.lookup m 100
  print v

DZD önce düzeltme 6.10.2, ile, 10M in ekleme:

$ time ./A 10000000  RTS -s
...
47s.

6.13 Düzelt sonra DZD ile:

./A 10000000  RTS -s 
...
8s

Varsayılan yığın bölgede artan:

./A  RTS -s -A2G
...
2.3s

Hashtables kaçınarak ve bir İntMap kullanarak:

import Control.Monad
import Data.List
import qualified Data.IntMap as I
import System.Environment

main = do
  [size] <- fmap (fmap read) getArgs
  let k = foldl' (\m n -> I.insert n n m) I.empty [1..size]
  print $ I.lookup 100 k

Ve elde ederiz

$ time ./A 10000000  RTS -s        
./A 10000000  RTS -s
6s

Ya da, alternatif olarak, judy bir dizi kullanarak Haskell sarıcı C yabancı fonksiyon arayüzü ile kod arama ():

import Control.Monad
import Data.List
import System.Environment
import qualified Data.Judy as J

main = do
  [size] <- fmap (fmap read) getArgs
  j <- J.new :: IO (J.JudyL Int)
  forM_ [1..size] $ \n -> J.insert (fromIntegral n) n j
  print =<< J.lookup 100 j

Bu çalışan

$ time ./A 10000000  RTS -s
...
2.1s

Gördüğünüz gibi yani, hashtables ile GC konudursabitvar , veher zaman diğer kütüphaneler ve veri yapılarıgayet uygun olan. Özet olarak, bu konu dışı.

Not: muhtemelen sadece hashtables paketi kullanmalısınız, a range of mutable hashtables yerel olarak destekleyen 2013.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • aki6336

    aki6336

    14 AÄžUSTOS 2008
  • NYCarspotter

    NYCarspotter

    26 EYLÃœL 2011
  • StalkerJS

    StalkerJS

    15 HAZÄ°RAN 2010