我使用GHC 7.8.3和Yesod 1.4.9遇到了小的CPU泄漏.
当我运行我的网站time并在1分钟后停止它(Ctrl + C)而没有做任何事情(只运行,根本没有请求),它消耗1秒.它占CPU的约1.7%.
$ time mysite
^C
real 1m0.226s
user 0m1.024s
sys 0m0.060s
Run Code Online (Sandbox Code Playgroud)
如果我禁用空闲垃圾收集器,它会下降到0.35秒(占CPU的0.6%).虽然它更好,但它仍然消耗CPU而不做任何事情.
$ time mysite +RTS -I0 # Disable idle GC
^C
real 1m0.519s
user 0m0.352s
sys 0m0.064s
$ time mysite +RTS -I0
^C
real 4m0.676s
user 0m0.888s
sys 0m0.468s
$ time mysite +RTS -I0
^C
real 7m28.282s
user 0m1.452s
sys 0m0.976s
Run Code Online (Sandbox Code Playgroud)
与cat无限期等待标准输入上的某些命令相比:
$ time cat
^C
real 1m1.349s
user 0m0.000s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
Haskell中还有其他东西在后台消耗CPU吗?
这是Yesod的漏洞吗?
或者这是我在我的程序中完成的事情?(我只添加了处理函数,我不做并行计算)
编辑2015-05-31 19:25
这是执行-s标志: …
我正在开发一个库,允许开发人员控制Minitel(法国可视图文终端).
我有很多常量值,我想知道使用Haskell管理它们的最佳方法.这是初学者的常见问题,但我没有找到令人满意的答案.
你可以看看我的项目 (注意:是的,只有一个模块中有太多的常量,这就是我正在做的事情;-))
我目前有模块保持它们name = value.虽然它有效但我想知道它是否可以完善或者我是否做得对.
aNUL = 0x00 -- Null
-- ...
aUS = 0x1f -- Unit Separator
Run Code Online (Sandbox Code Playgroud)
此方法有一个小缺点:您不能使用模式匹配,如果要保留名称,则需要使用警卫:
completeReturn :: MString -> Bool
completeReturn [] = False
completeReturn [0x19] = False -- eSS2
completeReturn [0x1b, 0x5b, 0x32] = False -- eESC, eCSI, 0x32
completeReturn [0x1b, 0x5b, 0x34] = False -- eESC, eCSI, 0x34
completeReturn [0x19, 0x4b] = False -- eSS2, 0x4b ; cedilla
completeReturn _ = True
Run Code Online (Sandbox Code Playgroud)
如果您不希望GHC因丢失的签名或类型默认值而对您大喊大叫,您还必须使用GHC选项:
{-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-type-defaults #-}
Run Code Online (Sandbox Code Playgroud)
我曾经尝试过data …
对于一个项目,我创建了一个基于Int的类型,只要程序试图使用超出限制的值(在我的情况下为[0..127])就会抛出错误.下面的代码执行此操作,它适用于我.
是否有可能在Haskell中创建第二个有界类型(例如[0..255])而不重复此代码?
谢谢你的回答
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Minitel.Type.MNatural (MNat, mnat, fromMNat) where
-- | The MNat type. The constructor is hidden.
newtype MNat = MakeMNat Int deriving (Real, Eq, Ord, Show)
-- | MNat is a bounded type
instance Bounded MNat where
minBound = MakeMNat 0
maxBound = MakeMNat 127
-- | Converts an Int into an MNat
mnat :: Int -> MNat
mnat x | loLimit <= x && x <= hiLimit = MakeMNat x
| otherwise = …Run Code Online (Sandbox Code Playgroud)