2014-05-03 19 views
5

Uzun bir hesaplama yapan bir Haskell programı çalıştırıyorum. Benim kod açıkça herhangi bir sistem çağrıları (bir dosyayı okur ve içinde bazı kodunu yorumlar) çağırmak olmamasına rağmen Sistemin çok zaman kullanıyordumHaskell profil oluşturma - clock_gettime

$ /usr/bin/time -v ./hl test.hl 
9000045000050000 
Command being timed: "./hl test.hl +RTS" 
User time (seconds): 1.43 
System time (seconds): 1.15 

: Bazı profilleme ve izleme sonra şu fark ettim. strace -ttT ile Running

bir zamanlayıcı çağrıları bir çok gösterir: Ben RTS clock olabileceğini düşündüm

17:04:52.454513 clock_gettime(CLOCK_THREAD_CPUTIME_ID, {1, 282721271}) = 0 <0.000529> 
17:04:52.456223 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000720> 
17:04:52.458749 rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0 <0.000239> 
17:04:52.460288 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {1, 285126436}) = 0 <0.000255> 
17:04:52.461650 --- SIGVTALRM {si_signo=SIGVTALRM, si_code=SI_TIMER, si_pid=0, si_uid=0, si_value=0} --- 
17:04:52.462242 rt_sigreturn()   = 0 <0.000458> 

, bu yüzden yeniden çalıştırmak devre dışı:

$ /usr/bin/time -v ./hl test.hl +RTS -V0 
9000045000050000 
Command being timed: "./hl test.hl +RTS -V0" 
User time (seconds): 1.73 
System time (seconds): 0.85 

Strace çıktısı hemen hemen aynı SIGVTALRM için hemen hemen aynı görünüyor:

17:05:16.409729 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {0, 155881514}) = 0 <0.000378> 
17:05:16.410746 clock_gettime(CLOCK_MONOTONIC, {2184631, 597586194}) = 0 <0.000432> 
17:05:16.412724 clock_gettime(CLOCK_THREAD_CPUTIME_ID, {0, 156994988}) = 0 <0.000290> 
17:05:16.413832 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000245> 
17:05:16.415017 rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0 <0.000305> 
birkaç soru:

  1. Haskell neden art arda clock_gettime çağırıyor?
  2. Bu işlevselliği devre dışı bırakmanın bir yolu var mı?
+0

sizin sorununuza bir çözüm olmasa da, ölçüme baktınız mı? – epsilonhalbe

+0

Profilleme ile mi çalışıyorsunuz? Profilleme ekstra iş yapar. – GarethR

+1

@GarethR: Profilleme olmadan koştuğumdan emin oldum, hatta bu gerçeklerden emin olmak için yeni bir kabin sandığı bile oluşturdum. –

cevap

0

Ben clock_gettime GHC RTS denilen yerde bir göz attık ve sırayla tarafından kullanılan GHC.Event kütüphanenin TimerManager içinde zaman aşımı temeli olduğunu getMonotonicTime bir çağrı kullanıldığını tespit IO Yöneticisi, tutamaçları, dosyaları, sistem çağrılarını vb. sorgulamak için kullanılır. MIO kağıdı, IO Yöneticisi'nde nispeten yeni bir kaynaktır. Her durumda, bu aramaları ortadan kaldırabileceğinizi hayal bile edemiyorum.

Ayrıca çok bu saat aramaların görürken, bu aslında vs. IO, performans ben GC daha ilgili hayal en zaman, alıyor sistem çağrıları, olduğu anlamına gelmez unutmayın

İlgili konular