erlang - 当涉及多个参与者/进程时,如何计算 Elixir 中的 CPU 时间?

标签 erlang elixir

假设我有一个函数,它通过生成多个进程来完成一些工作。我想比较该函数所用的 CPU 时间与实际时间。

def test do

  prev_real = System.monotonic_time(:millisecond)

  # Code to complete some task
  # Spawn different processes & give each process some task
  # Receive result 
  # Finish task

  current_real = System.monotonic_time(:millisecond)
  diff_real = current_real - prev_real

  IO.puts "Real time " <> to_string(diff_real)

  IO.puts "CPU time ?????" 

end

如何计算给定函数所需的CPU时间?我对计算 CPU 时间/实时比率感兴趣。

最佳答案

如果您只是尝试分析代码而不是实现自己的分析框架,我建议使用现有的工具,例如:

  • fprof这将为您提供有关在函数(真实的和自己的)中花费的时间的信息
  • percept这将为您提供有关系统中的哪些进程在任何给定时间正在运行以及在什么情况下运行的信息
  • xprof其设计目的是帮助您找到对函数的哪些调用将导致其花费更多时间(触发低效的代码分支)。

他们利用 erlang:trace 来确定正在执行哪个函数以及执行多长时间,并利用 erlang:system_profilerunnable_procs以确定当前正在运行哪些进程。您可能会启动一个函数,命中接收或抢先重新安排并等待,而不执行任何实际工作。将这两者结合起来可能会很复杂,我建议在尝试将自己的工具粘合在一起之前使用现有的工具。

您还可以查看 erlgrind 等工具和 eflame如果您正在寻找更直观的通话表示。

关于erlang - 当涉及多个参与者/进程时,如何计算 Elixir 中的 CPU 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46247398/

相关文章:

Erlang:节点完全卡住。怎么办?

ruby-on-rails - 是否有适用于Erlang的Sinatra风格的Web框架?

Elixir - 跟踪函数调用

elixir - 手动添加 gettext 翻译键

elixir - Elixir 日志中的额外空行?

bash - 使用 Ansible 将二进制文件添加到 PATH

php - 如何使用 erlang 在 Redis 中存储键值对,然后使用 php 访问该存储?

linux - 使操作系统为 Erlang 提供更多内存访问

erlang - 在 Erlang 中链接和监视同一个进程时会发生什么

date - 将 javascript 日期解析为 Elixir 格式