是否有任何隐藏的选项将成本中心放入图书馆?目前我已经设置了这样的分析:
ghc-prof-options: -O2
-threaded
-fexcess-precision
-fprof-auto
-rtsopts
"-with-rtsopts=-N -p -s -h -i0.1"
Run Code Online (Sandbox Code Playgroud)
# cabal sandbox init
# cabal install --enable-library-profiling --enable-executable-profiling
# cabal configure --enable-library-profiling --enable-executable-profiling
# cabal run
Run Code Online (Sandbox Code Playgroud)
这可以在程序完成时创建预期的.prof文件,.hp文件和摘要.
问题是该.prof文件不包含任何不属于当前项目的内容.我的猜测是,可能有一个选项可以将成本中心放在外部库代码中?
在我的kdtree项目,我刚刚更换被深度计数器Int为基础的,以一个明确的Key a基础上,类型a在KDTree v a.这是差异.
现在,虽然我认为这应该是类型级别的更改,但我的基准测试显示性能急剧下降:
之前:
benchmarking nr/kdtree_nr
mean: 60.19084 us, lb 59.87414 us, ub 60.57270 us, ci 0.950
std dev: 1.777527 us, lb 1.494657 us, ub 2.120168 us, ci 0.950
Run Code Online (Sandbox Code Playgroud)
后:
benchmarking nr/kdtree_nr
mean: 556.9518 us, lb 554.0586 us, ub 560.6128 us, ci 0.950
std dev: 16.70620 us, lb 13.58185 us, ub 20.63450 us, ci 0.950
Run Code Online (Sandbox Code Playgroud)
在我深入Core之前......任何人都知道这里发生了什么?
所建议的托马斯(和userxyz)我取代data Key a :: *与 …
我正在研究我的下一个项目.这是一个预先规划阶段,所以这个问题只是为了对现有技术进行概述.
我有一个有多个输入和输出的有向无环图(DAG),现在想想人工神经网络:

处理这种结构的常用方法是在每个(时间)步骤处理整个网络.我相信这是frp库使用的方法,比如netwire.
现在我处于幸运的位置,我有一个事件流,每个事件都在一个输入节点中呈现变化.我的想法是,如果我可以静态地知道给定的更改只会影响其中的一部分,我可能不需要步进网络中的每个节点.
例
在上面的图像中,5,7和3是输入,11和8是"隐藏的",2,9和10是输出节点.节点5处的改变将仅影响节点11并且实际上影响节点2,9和10.我将不需要处理节点7,3和8.
以尽可能小的延迟处理这种网络.图形的大小可能达到100k节点,每个节点进行适量的计算.
我希望有人会站出来宣传图书馆X,只是完成工作.
否则,我当前的计划是从图形描述中导出每个输入节点的计算.可能我会使用Parmonad,这样我就不必自己处理数据依赖,仍然可以从多核机器中受益.
Par计划可行吗?这取决于每个节点所需的处理量?简单问题:为什么不触发重写规则?
{-# RULES "fmap/fmap" forall f g xs. fmap f (fmap g xs) = fmap (f.g) xs #-}
main = do
txt <- fmap head (fmap words (readFile "foo.txt"))
print txt
Run Code Online (Sandbox Code Playgroud)
现在我想写一个提取fun触发规则,因为它在之前的测试中做了...不是这次.
{-# RULES "fmap/fmap" forall f g xs. fmap f (fmap g xs) = fmap (f.g) xs #-}
fun f g xs = fmap f (fmap g xs)
main = do
txt <- fun (drop 1) words (readFile "foo.txt")
print txt
Run Code Online (Sandbox Code Playgroud)
直到我偶然添加了一个模块名称:
module Main where
{-# RULES …Run Code Online (Sandbox Code Playgroud) 我刚刚haskellmode-vim从我的插件配置中禁用.基本上这有三个原因:
neocomplcache我的自动完成需求.cabal我希望有人跳进坑中并指出我只是错误配置了整个事情(就像我在自述文件中配置了最基本的东西).提出这个问题:
是否可以设置haskellmode,以便......
我刚刚创建了一个Haskell Travis CI项目.travis.yml:
language: haskell
ghc:
- 7.8
- 7.10
Run Code Online (Sandbox Code Playgroud)
但特拉维斯将第二个版本解释为7.1:https://travis-ci.org/fhaust/dtw/jobs/57648139
仅当我将其括在引号中时才会识别该版本(尽管这会导致其他错误,因为7.10不是Travis CI上可用的版本):
language: haskell
ghc:
- 7.8
- "7.10"
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?
关于travis-ci的GHC 7.10有一个未解决的问题:https://github.com/travis-ci/travis-ci/issues/3785
我可能只是花了一天的计算时间徒劳:)
问题是我(天真地)将大约3.5GB(压缩)的[(Text, HashMap Text Int)]数据写入文件,此时我的程序崩溃了.当然],数据末尾没有最终版本,而且它的庞大规模使得手动编辑变得不可能.
数据是通过格式化的Prelude.show,就在此时我意识到Prelude.read在返回任何数据之前需要将整个数据集存入内存(不可能).
现在......有没有办法恢复数据而无需手动编写解析器?
更新1
main = do
s <- getContents
let hs = read s :: [(String, M.Map String Integer)]
print $ head hs
Run Code Online (Sandbox Code Playgroud)
我尝试过这个...但它只是在被操作系统杀死之前不断消耗更多内存.
所以...我已经使用了未装箱的载体(来自vector包装),现在最好不要考虑太多.vector-th-unbox为他们创建实例变得轻而易举,为什么不呢.
现在我遇到了一个实例,我无法自动派生那些实例,一个带有幻像类型参数的数据类型(如Vector (s :: Nat) a,s编码长度).
这让我想到了Storable和Unboxed矢量之间的差异.我自己想出的事情:
Unboxed 将元组存储为单独的向量,从而导致更好的高速缓存局部性,而不需要在仅需要其中一个值时浪费带宽.Storable仍将编译为简单(可能有效)的readArray#s,返回未装箱的值(通过阅读核心显而易见).Storable允许直接指针访问,允许与外部代码的互操作性.Unboxed没有.Storable实例实际上是更容易用手比写Unbox(即Vector和MVector)的.仅仅这一点并没有让我明白为什么Unboxed即使存在,似乎也没什么好处.可能我错过了那里的东西?
是否存在内置于GHC(以及一般Haskell)派生实例的短路Eq,当我比较数据类型的同一实例时会触发该实例?
-- will this fire?
let same = complex == complex
Run Code Online (Sandbox Code Playgroud)
我的计划是读取一个惰性数据结构(比如一棵树),更改一些值,然后比较旧版本和新版本以创建一个差异,然后将其写回文件.
如果内置短路,那么一旦发现新结构引用旧值,比较步骤就会中断.同时,这首先不会从文件中读取.
我知道我不应该担心Haskell中的引用,但这似乎是处理惰性文件更改的好方法.如果内置没有短路,是否有办法实现这一点?对不同方案的建议表示欢迎.