【问题标题】:thorough guide for profiling racket code分析球拍代码的详尽指南
【发布时间】:2014-07-22 04:58:15
【问题描述】:

进行了一些谷歌搜索(“球拍分析”、“球拍测量性能”),但没有找到任何内容,并且文档中没有示例。甚至在htdp 上进行了谷歌“个人资料”搜索 - 没有运气。 (profile (f ...)) 的输出除了小 sn-ps 之外并不那么明显。

理想情况下,我想要类似 python 的 python -m cProfile 用法示例。

【问题讨论】:

  • 有些人可能希望将其作为工具/库请求关闭,但由于 Racket 开发环境的很多内容都捆绑在一起,所以这是一个关于“如何使用 Racket 的分析器? "

标签: profiling racket


【解决方案1】:

当我搜索“Python profiling”时,DuckDuckGo 和 Google 都将其作为最高结果:26.4. The Python Profilers

(虽然我快速浏览了它,但它似乎更像是一个参考,而不是带有示例的“全面使用指南”。所以如果你有其他想法,也许你可以链接到那个?)

等效的 Racket 文档为:Profile: Statistical Profiler

一个用法示例:

#lang racket
(require profile)
(profile-thunk (thunk (function-to-profile arg0 arg1) ))

这里(thunk e)只是方便(lambda () e)


更大的例子:

#lang racket

(module mod racket
  (provide f)
  (define (f)
    (for/list ([i 10000])
      i)))

(require (prefix-in mod: 'mod))

(define (f)
  (for ([i 10000])
    (mod:f)))

(require profile)
(profile-thunk f)

对我来说这个输出:

Profiling results
-----------------
  Total cpu time observed: 5666ms (out of 5753ms)
  Number of samples taken: 105 (once every 54ms)

========================================================
                               Caller
Idx   Total        Self      Name+src             Local%
      ms(pct)      ms(pct)     Callee
========================================================
[1] 5666(100.0%)    0(0.0%)  [running body] /tmp/profile.rkt:##f
                               profile-thunk14 [2]100.0%
--------------------------------------------------------
                               [running body] [1] 100.0%
[2] 5666(100.0%)    0(0.0%)  profile-thunk14 ...e-pkgs/profile-lib/main.rkt:9:0
                               run [3]            100.0%
--------------------------------------------------------
                               profile-thunk14 [2]100.0%
[3] 5666(100.0%)    0(0.0%)  run ...pkgs/profile-pkgs/profile-lib/main.rkt:31:2
                               for-loop [4]       100.0%
--------------------------------------------------------
                               run [3]            100.0%
[4] 5666(100.0%) 1630(28.8%) for-loop /tmp/profile.rkt:12:2
                               f [5]               71.2%
--------------------------------------------------------
                               for-loop [4]       100.0%
[5] 4036(71.2%)  1786(31.5%) f /tmp/profile.rkt:5:2
                               for-loop [6]        55.8%
--------------------------------------------------------
                               f [5]              100.0%
[6] 2250(39.7%)  2250(39.7%) for-loop /tmp/profile.rkt:6:4
--------------------------------------------------------

请注意,它确实显示了行号,因此即使有两个名为 f 的函数,也可以看到是哪一个 - 实际上是每个函数的哪一部分。


我也强烈推荐Optimization Coach 包。尽管这会给您带来与传统分析器不同的见解,但它也会为您提供具体的建议,如何将代码更改得更快。作为一个副产品,它首先会教你如何以这种方式编写它。

【讨论】:

  • 等效的 Racket 文档有零(!)个例子。真是令人惊讶。仅分析表达式是不够的(阅读:没有行号)。可以玩弄,不适合更大的代码imo。特别是如果我的内部函数具有相同的名称。至于彻底性..我看到很多关于“python profiling”的博客文章。没有什么球拍了。感谢“选择。教练”一定会看看。
  • 实际上它确实显示了行号。请查看我更新的答案以及稍大的示例和输出。
  • 附注虽然我认为 Racket 文档总体上非常好,但我同意它可以使用更多示例。
  • @bravmech 如果这回答了您提出的问题,请您将其标记为已接受?谢谢。
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 2010-09-08
  • 2011-04-14
  • 1970-01-01
  • 2013-09-11
  • 2013-11-12
相关资源
最近更新 更多