网站大量收购独家精品文档,联系QQ:2885784924

第二十五章:性能分析与优化.pdf

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档