假设我有一个函数,它通过生成多个进程来完成一些工作。我想比较该函数所用的 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_profile
和 runnable_procs
以确定当前正在运行哪些进程。您可能会启动一个函数,命中接收或抢先重新安排并等待,而不执行任何实际工作。将这两者结合起来可能会很复杂,我建议在尝试将自己的工具粘合在一起之前使用现有的工具。
关于erlang - 当涉及多个参与者/进程时,如何计算 Elixir 中的 CPU 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46247398/