2017-09-15 15 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等工具。