2017-09-27 16 views
1

我有以下構建系統爲什麼這個簡單的構建系統的抖動進度估計非常錯誤?

module Main where 

import Development.Shake 

main :: IO() 
main = shakeArgs shakeOptions $ do 

    "a" %> \out -> do 
    need ["a.in"] 
    cmd_ "sleep" "10" 
    cmd "touch" [out] 

我建立與stack buildstack exec myShake -- --progress a運行。

如果我做了一個乾淨的構建和比touch a.in並再次運行,搖動顯示我非常錯誤的進度預測。有時它預測1000分鐘或更多。當我每5秒在終端的標題欄中獲得一個進度預測時,如果我正確理解了這一點,我只會在這裏談論第一個進度預測,因爲這是我用這個構建系統獲得的唯一一個進度預測例如。)

我使用lts-9.6與堆棧和搖版本0.16(通過git +在stack.yaml包中的條目)。

回答

1

如何進步的作品可以在progressDisplay找到的文檔:

當前的實現是預測剩餘時間(基於timeTodo)和已經完成(timeBuilt)的工作。然後百分比計算爲remaining/(done + remaining),剩餘時間是通過在此構建中保留的觀察工作率來計算的,大致爲done/time_elapsed

如果構建系統非常短,只能做一件事情,工作率一般都是垃圾 - 所以最終會用剩下的工作量(可能在10秒時預測)隨機編號(推測一個很大的數字,得到1000米)。

工作速率變化的想法是,有時你在筆記本電腦上使用電池供電與主電源,有時你會傳遞不同的平行標誌。很可能Shake應該使用一個或多個線程作爲工作速率的近似值,至少在開始時。

+0

我提出了調查票:https://github.com/ndmitchell/shake/issues/537 –

1

看起來第一個進度估計消息通常是無用的。對於非微不足道的構建系統來說,這不應該是一個問題,因爲它們需要超過五秒的時間。

使用這個構建系統和--progress=1人們可以看到,第一估計是這樣的,但其他人變得更好:

module Main where 

import Development.Shake 

main :: IO() 
main = shakeArgs shakeOptions $ do 
    mapM_ (\i -> 
    ("a." ++ show i) %> \out -> 
     do 
     need [out ++ ".in", "a." ++ show (i-1)] 
     cmd_ "sleep" "1" 
     cmd "touch" [out]) 
    [1 .. 10] 

    "a.0" %> \out -> do 
    need ["a.0.in"] 
    cmd_ "sleep" "1" 
    cmd "touch" [out] 

要嘗試了這一點,你需要做的

for i in $(seq 0 10); do touch a.$i.in; done 

在您使用此示例構建系統的工作目錄中。

相關問題