2017-09-15 50 views
2

假设我有一个通过产生多个进程来完成一些工作的函数。我想比较CPU时间与此功能实时性的比较。如何计算多个参与者/进程涉及的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时间/实时比率。

回答

3

如果你只是想分析代码,而不是实现自己的分析框架,我会建议使用现有工具,如:

  • fprof,这将给你有关的功能所花费的时间(实际和自己的信息)
  • percept将为您提供有关哪些进程在你的系统在任何给定的时间洁具工作,对什么样的信息
  • xprof这是设计来帮助你找到它调用你的函数将导致它需要更多的时间(触发低效的代码分支)。

他们利用两个erlang:trace的找出正在执行其功能多长时间和erlang:system_profilerunnable_procs以确定哪些进程正在运行。你可能会开始一个功能,打一个接收或被抢先重新安排,然后等待而不做任何实际的工作。将这两者结合起来可能会很复杂,我建议在尝试将自己的胶粘在一起之前使用已有的工具。

如果您正在寻找更多可视化的呼叫表示,您还可以查看erlgrindeflame等工具。