【问题标题】:how to profile a Haskell programm with lots of System.Process.readProcess?如何分析具有大量 System.Process.read 进程的 Haskell 程序?
【发布时间】:2014-07-21 01:08:46
【问题描述】:

我有一个多线程 Haskell 程序,它使用 System.Process.readProcess 调用外部程序,并且经常这样做。我如何衡量绩效? (决定我应该改进我的程序还是外部程序。)“外部时间”如何显示在配置文件(+RTS -p)或事件日志(线程范围图片)中?

【问题讨论】:

  • 用堆栈的快照来做。取其中的 10 个。例如,如果它位于其中 6 个的 readProcess 中,这意味着外部程序大约占用了该线程 60% 的时间。

标签: haskell profiling


【解决方案1】:

您可以使用ProcMon 完成此任务。

在您的进程名称上放置过滤器,仅选择“显示进程和线程活动”,您可以准确地看到哪个更耗时。您甚至可以保存和解析日志进行长时间监控。

我还建议您使用另一种方法来解决此问题:

  1. 子进程
    1. 在 main 上创建一个循环并等待外部事件(套接字、管道等)
    2. 处理请求并发送结果
    3. 阻塞直到下一个请求。
  2. 主要流程:
    1. 派生一个或多个子进程
    2. 将请求发送给可用的孩子
    3. 等待回复

这样你就可以摆脱在不断产生/杀死子进程中浪费的开销。

【讨论】:

    【解决方案2】:

    您是否考虑过使用 Criterion,一个 Haskell 微基准测试库?

    这个库提供了一种强大而简单的方法来衡量软件性能。它提供了一个用于执行和分析基准测试的框架和一组驱动程序函数,使构建和运行基准测试以及分析其结果变得容易。

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 2011-03-17
      • 2014-10-27
      • 1970-01-01
      • 2019-08-20
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多