测量erlang中的并发循环时间

时间:2014-04-28 18:57:25

标签: concurrency erlang

我在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,但我无法找到如何做到这一点。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

衡量往返时间的一种方法是发送时间戳和每条消息。当第一个节点收到消息时,它可以测量往返时间,计算Total_Run_Time - Timestamp

要计算总运行时间,我会记住过程状态(或字典)中的第一个时间戳,并计算停止测试时的总运行时间。

此外,鉴于您提到网络,您确定CPU时间(statistics(runtime)计算的是您之后的时间吗?也许,挂钟时间会更合适。