- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二十五章:性能分析与优化
第⼆⼗五章:性能分析与优化
Haskell 是⼀门⾼级编程语⾔,⼀门真正的⾼级编程语⾔。 我们可以⼀直使⽤抽象概
念、⼳半群、函⼦、以 多态进⾏编程,⽽不必与任何特定的硬件模型打交道。
Haskell 在语⾔规范⽅⾯下了很⼤的功夫,⼒求语⾔可以不受制于某个特定的求值模
型。这⼏层抽象使得我们可以把 Haskell 作为计算本⾝的记号,让编程⼈员关⼼他们
问题的关键点,⽽不⽤操⼼低层次的实现细节,使得⼈们可以⼼⽆旁骛地进⾏编程。
但是,本书介绍的是真实世界中的编程⾏为,⽽真实世界中的代码都运⾏在资源有限
的硬件之上,并且程序也会有时间和空间上的限制。因此,我们需要掌握好表达程序
数据的⽅法,准确地理解使⽤惰性求值和严格求值策略带来的后果,并学会如何分析
和控制程序在执⾏时的时间和空间。
在这⼀章,我们将看到 Haskell 编程中可能遇到的典型空间和时间问题,并且如何有
条理地分析、理解并解决它们。为此我们将研究使⽤⼀系列的技术:时间和空间使⽤
分析,运⾏时统计,以 对严格求值和惰性求值。我们也会看下编译器优化对性能的
影响,以 ⾼级优化技术在纯函数式编程语⾔中的应⽤。那么,让我们⽤⼀个挑战开
始吧:调查⼀个简单程序中不必要内存的使⽤问题。
Haskell程序性能分析¶
请看下⾯这个列表处理程序,它⽤于计算某个⼤型列表的平均值。这⾥展⽰的只是程
序的其中⼀部分代码 (并且具体的实现算法我们并不关⼼),这是我们经常会在真实
的 Haskell 程序中看到的典型的简单列表操作代码,这些代码⼤量地使⽤标准库函
数,并且包含了⼀些因为疏忽⼤意⽽导致的性能问题。这⾥也展⽰了⼏种因疏忽⽽易
出现的性能问题。
-- file: ch25/A .hs
import System.Environment
import Text.Printf
main = do
d] - map read `fmap` getArgs
printf %f\n (mean 1..d])
mean :: Double] - Double
mean xs = sum xs / fromIntegral (length xs)
这个程序⾮常简单:我们引⽤了访问系统环境的函数 (即 getArgs ),和 Haskell 版
的 printf 函数来格式化输出。接着这个程序从命令⾏读⼊⼀个数字来构建⼀个由浮
点数组成的列表。我们⽤这个列表的和除以列表的长度得到平均值,然后以字符串的
形式打印出来。我们来将此代码编译成机器代码 (打开优化开关)然后⽤ time 执⾏
它看看情况吧:
$ ghc --make -rtsopts -O2 A .hs
1 of 1] Compiling Main ( A .hs, A .o )
Linking A ...
$ time ./A 1e5
50000.5
./A 1e5 0.05s user 0.01s system 102% cpu 0.059 total
$ time ./A 1e6
500000.5
./A 1e6 0.26s user 0.04s system 99% cpu 0.298 total
$ time ./A 1e7
5000000.5
./A 1e7 63.80s user 0.62s system 99% cpu 1:04 .53 total
程序在处理少量输⼊时运⾏得⾮常好,但是当输⼊的列表元素数量达到⼀千万个时,
程序的运⾏速度就会变得相当缓慢。从这点我们就能感觉到应该有什么地⽅做得不
对,但我们并不清楚它的资源使⽤情况。 我们需要研究下。
记录运⾏时统计数据¶
为了能收集这些情报,GHC⽀持传⼊ +RTS 和 -RTS 这些特殊选项。这些选项是传给
Haskell 运⾏时本⾝的,Haskell程序为会感知到它们的存在。
特别地,我们可以⽤ -s 选项来让运⾏时系统收集内存和垃圾收集性能参数 (并可以
⽤ -N来控制系统线程的数量,或调整栈和堆的⼤⼩)。我们将⽤运⾏时选项来打开
性能分析的⼏种不同变量。Haskell 运⾏时所能接受的所有选项列表可以参见GHC⽤
户⼿册。
那么让我们⽤ +RTS -sstderr 来运⾏程序收集我们所需要的结果吧。
$ ./A 1e7 +RTS -sstderr
5000000.5
1,689,133,824 bytes allocated in the heap
697,882,192 bytes copied during GC (s
您可能关注的文档
- 第三章 第二讲 初等矩阵.ppt
- 第三章 细胞的结构和功能-4.doc
- 第三章 线性直流电路12.ppt
- 第三章 连续型随机变量 2.ppt
- 第三章 非线性方程的迭代法.pdf
- 第三章(理工)n维向量与向量空间.pdf
- 第三章 矩阵的初等变换和线性方程组 习题.ppt
- 第三章-2 纤维素的物理化学性质.pdf
- 第三章 数学.ppt
- 第三章 第二节 细胞器 一.ppt
- 集体亲子户外活动方案.pptx
- 2025年延边市税务系统事业单位人员招聘笔试考试题库及答案解析.docx
- 2025年新疆维吾尔自治区交通运输系统事业单位人员招聘笔试考试题库及答案解析.docx
- 2025年雅安市林业系统事业单位人员招聘笔试考试题库及答案解析.docx
- 2025年西双版纳市法院书记员招聘笔试考试题库及答案解析.docx
- 2025年铜川市法院书记员招聘笔试考试题库及答案解析.docx
- 2025年芜湖市街道办人员招聘笔试考试题库及答案解析.docx
- 2025年柳州市卫生健康系统事业单位人员招聘笔试考试题库及答案解析.docx
- 2025年伊春市卫生健康系统事业单位人员招聘笔试考试题库及答案解析.docx
- 2025年临夏市法院书记员招聘笔试考试题库及答案解析.docx
文档评论(0)