我在erlang中创建了一个进程,并希望测量第一个消息通过网络和整个消息系列所花费的时间,每次第一个节点收到消息后它再发送另一个消息。 现在在第一个节点中我有以下代码:
receive
stop->
io:format("all processes stopped!~n"),
true;
start->
statistics(runtime),
Son!{number, 1},
msg(PID, Son, M, 1);
{_, M} ->
{Time1, _} = statistics(runtime),
io:format("The last message has arrived after ~p! ~n",[Time1*1000]),
Son!stop;
当然我在发送第一条消息时开始统计。 如你所见,我使用Time_Since_Last_Call作为第一个消息循环,并希望在整个运行中使用Total_Run_Time,问题是Total_Run_Time是累积的,因为我是第一次开始统计。 我想到的第二个想法是使用另一个进程,其中有两个接收循环,每个进程添加它们并打印,但我确信erlang可以做得比这更好。 我想解决这个问题的最佳方法是以某种方式刷新Total_Run_Time,但我无法找到如何做到这一点。任何想法如何解决这个问题?
答案 0 :(得分:1)
衡量往返时间的一种方法是发送时间戳和每条消息。当第一个节点收到消息时,它可以测量往返时间,计算Total_Run_Time - Timestamp
。
要计算总运行时间,我会记住过程状态(或字典)中的第一个时间戳,并计算停止测试时的总运行时间。
此外,鉴于您提到网络,您确定CPU时间(statistics(runtime)
计算的是您之后的时间吗?也许,挂钟时间会更合适。