2017-09-27 28 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 

在您使用此示例构建系统的工作目录中。

相关问题