Tag: haskell

分析高性能Haskell代码

我有一些高性能的Haskell代码 – 内部循环编译为6个汇编指令。 内环效率低下对性能没有明显的影响,说明内环不是瓶颈。 但是,打开性能分析时,为内部循环生成的汇编代码效率会大大降低,而且性能分析器报告内部循环占用了85%的时间。 我怀疑有些东西是不必要的慢,但是当我使用剖析来看看,我怀疑剖析使内部循环足够慢,以至于它占主导地位。 我可以用什么技术来看看时间在哪里? 如果一个Haskell存在的话,一个采样分析器将会非常棒。

如何在Haskell中获得5GB堆的控制权?

目前我正在试验用Snap编写的一个Haskellnetworking服务器,它加载并提供给客户大量的数据。 而且我非常非常难以控制服务器进程。 在随机的时刻,这个过程使用了大量的CPU几分钟到几分钟,并且对客户端请求没有反应。 有时内存使用会在几秒钟内高峰(有时会下降)数百兆字节。 希望有人对长时间运行的Haskell进程有更多的经验,这些进程使用大量的内存,并且可以给我一些指针来使事情更稳定。 我已经debugging了好几天了,现在我开始有点绝望了。 我的设置一点点概述: 在服务器启动时,我将大约5千兆字节的数据读入内存中的大(嵌套)Data.Map-like结构。 嵌套地图的值是严格的,地图中的所有值都是数据types,所有的字段也都是严格的。 我花了很多时间确保没有未经评估的thunk被留下。 导入(取决于我的系统负载)大约需要5-30分钟。 奇怪的是连续运行的波动比我想象的要大得多,但这是一个不同的问题。 大数据结构位于由Snap服务器产生的所有客户端线程共享的“TVar”内。 客户可以使用小型查询语言来请求数据的任意部分。 数据请求量通常很小(高达300kb左右),只能触及数据结构的一小部分。 所有只读请求都使用“readTVarIO”来完成,所以它们不需要任何STM事务。 服务器使用以下标志启动:+ RTS -N -I0 -qg -qb。 这将以multithreading模式启动服务器,禁用空闲时间和并行GC。 这似乎加快了这个过程。 服务器大多运行没有任何问题。 然而,客户端请求每隔一段时间就会超时,CPU高达100%(甚至超过100%),并持续很长一段时间。 同时服务器不再响应请求。 我能想到的几个原因可能会导致CPU使用率: 这个请求需要花费很多时间,因为有很多工作要做。 这是不太可能的,因为有时会发生在以前的运行中已经certificate是非常快的请求(我的意思是20-80ms左右)。 在数据被处理和发送给客户端之前,仍然有一些未被评估的thunk需要被计算。 这也是不太可能的,与前面的观点一样。 不知何故垃圾收集踢,并开始扫描我的整个5GB的堆。 我可以想象这会花费很多时间。 问题是,我不知道如何弄清楚到底发生了什么,该怎么办。 由于导入过程需要很长时间,因此分析结果不会显示任何有用的信息。 似乎没有办法有条件地打开和closures代码内的分析器。 我个人认为GC是这里的问题。 我正在使用GHC7,似乎有很多选项来调整GC的工作方式。 通常非常稳定的数据使用大堆时,您推荐什么样的GC设置?

如何在GHC中编写尽可能高效的数据结构?

所以有时我需要写一个我在Hackage上找不到的数据结构,或者我发现没有经过testing或者质量足够让我信任,或者只是我不想成为依赖的东西。 我正在阅读冈崎的书,它很好的解释了如何devise渐近快速的数据结构。 但是,我正在与GHC合作。 对于我的应用程序来说,恒定的因素是很重要 内存使用对我来说也是一个大问题。 所以我有关于GHC的具体问题。 尤其是 如何最大限度地共享节点 如何减less内存占用 如何避免由于不严格/懒惰造成的空间泄漏 如何让GHC为重要代码段产生严密的内部循环 我环顾了networking上的各个地方,我对如何使用GHC有一个模糊的想法,例如,看核心输出,使用UNPACK编译指示等。 但我不知道我明白了。 所以我popup我最喜欢的数据结构库,容器,并查看Data.Sequence模块。 我不能说我很了解他们正在做什么使Seq快速。 FingerTree a的定义首先引起我的FingerTree a 。 我认为这只是我不熟悉手指树而已。 第二个引人注目的是所有的SPECIALIZE杂项。 我不知道这里发生了什么事情,而且我很好奇,因为这些代码遍布各处。 许多函数也有与之相关的INLINE附注。 我可以猜出这是什么意思,但是如何判断什么时候使用INLINE函数呢? 在~475线附近的事情变得非常有趣,一节被称为“适用性build设”。 他们定义了一个新的包装来表示身份monad,他们自己写了严格的monad副本,他们有一个定义为applicativeTree的函数,这个函数显然是专用于身份monad的,这就增加了函数输出的共享。 我不知道这里发生了什么事。 正在使用什么巫术来增加分享? 无论如何,我不确定从Data.Sequence学到多less东西。 还有其他的“模范课程”,我可以读懂智慧吗? 我真的很想知道如果我真的需要他们加快速度,那么我的数据结构将会如何。 有一点特别是写数据结构,使融合变得容易,以及如何写好融合规则。

简单的haskellunit testing

我想通过99个Haskell问题 ,我想专注于解决scheme,但与testing。 如果我将第一个问题的解决scheme作为3行.hs文件, myLast :: [a] -> a myLast [x] = x myLast (_:xs) = myLast xs 什么是我可以添加到这个最小的代码量,以便我可以添加内联testing,并与runhaskell运行它们?

所有在斯卡拉

如下所示,在Haskell中,可能存储具有不同types的列表值,并且在其上具有特定的上下文边界: data ShowBox = forall s. Show s => ShowBox s heteroList :: [ShowBox] heteroList = [ShowBox (), ShowBox 5, ShowBox True] 我怎么能达到相同的斯卡拉,最好是没有分类?

为什么Haskell程序比等效的Python程序慢得多?

作为编程挑战的一部分,我需要从标准input读取空格分隔的整数序列( 在一行中 ),并将这些整数的总和打印到标准输出。 有问题的序列可以包含多达10,000,000个整数。 我有两个解决scheme:一个用Haskell编写( foo.hs ),另一个用Python 2( foo.py )编写。 不幸的是,(编译后的)Haskell程序比Python程序一直慢,我不知道如何解释这两个程序之间的性能差异。 请参阅下面的基准部分。 如果有的话,我会希望Haskell占上风。 我究竟做错了什么? 我怎样才能解释这种差异? 有没有简单的方法来加快我的Haskell代码? (有关信息,我正在使用8Gb RAM,GHC 7.8.4和Python 2.7.9的2010年中期Macbook Pro。) foo.hs main = print . sum =<< getIntList getIntList :: IO [Int] getIntList = fmap (map read . words) getLine (用ghc -O2 foo.hs编译) foo.py ns = map(int, raw_input().split()) print sum(ns) 基准 在下面, test.txt由一行1000万个空格分隔的整数组成。 # […]

为什么Haskell错过了“显而易见的”types

考虑面向对象的语言: 大多数来自面向对象编程背景的人都熟悉各种语言中常见的直观界面,这些界面捕捉了Java Collection & List界面的精髓。 Collection是指不一定具有自然顺序/索引的对象的集合。 List是一个具有自然顺序/索引的集合。 这些接口抽象了Java中的许多库数据结构,就像他们在其他语言中的等价接口一样,并且需要对这些接口有一个深入的了解才能与大多数库数据结构有效地协作。 过渡到Haskell: Haskell有一个types类系统,类似于对象上的接口types。 Haskell似乎有一个关于Functors,Applicative,Monads等devise良好的types层次结构 。 他们显然需要正确和抽象的types 。 然而,当你看到许多Haskell的容器( List , Map , Sequence , Set , Vector )时,它们几乎都具有非常相似的(或相同的)function,但不是通过types类来抽象的。 一些例子: null用于testing“ null ” 元素数量的length / size elem / member列入集合 empty 和/或 singleton默认构造 union联盟 (\\) / diff设置差异 (!) / (!!)进行不安全的索引(部分function) (!?) / lookup安全索引(总function) 如果我想使用上面的任何函数,但是我导入了两个或多个容器,我必须从导入的模块中隐藏函数,或者只从模块导入必要的函数,或者限定导入的模块。 但是因为所有的function都提供了相同的逻辑function,所以看起来就像一个麻烦。 如果函数是从types类定义的,而不是在每个模块中单独定义的,那么编译器的types推断机制就可以解决这个问题。 只要他们共享types类(例如:让我们只使用Sequence而不是List来获得更好的随机访问效率),它也会使底层容器的切换变得简单。 为什么Haskell没有一个Collection和/或Indexabletypes的类来统一和概括这些函数呢?

haskell列表中的独特元素

好吧,这可能是前奏,但是:是否有一个标准的库函数来查找列表中的独特元素? 我的(重新)实施,澄清,是: has :: (Eq a) => [a] -> a -> Bool has [] _ = False has (x:xs) a | x == a = True | otherwise = has xs a unique :: (Eq a) => [a] -> [a] unique [] = [] unique (x:xs) | has xs x = unique xs | otherwise […]

使用Monadic QuickChecktestingIO操作

任何人都可以给我一个使用Monadic QuickChecktestingIO操作的简单例子吗?

什么是单态限制?

我很困惑haskell编译器如何推断比我所期望的多态性更less的types,例如,当使用无点定义时。 看起来问题是“单态限制”,在编译器的旧版本上默认是这样的。 考虑下面的haskell程序: {-# LANGUAGE MonomorphismRestriction #-} import Data.List(sortBy) plus = (+) plus' x = (+ x) sort = sortBy compare main = do print $ plus' 1.0 2.0 print $ plus 1.0 2.0 print $ sort [3, 1, 2] 如果我用ghc编译这个,我没有得到erros,可执行文件的输出是: 3.0 3.0 [1,2,3] 如果我将main更改为: main = do print $ plus' 1.0 2.0 print $ […]