【问题标题】:measuring concurent loop times in erlang在erlang中测量并发循环时间
【发布时间】:2014-04-30 17:19:04
【问题描述】:

我在 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 是累积的,因为我第一次开始统计。 我想到的第二个想法是使用另一个带有 2 个接收循环的进程来获取每个添加它们并打印的时间,但我确信 erlang 可以做得比这更好。 我想解决这个问题的最好方法是以某种方式刷新 Total_Run_Time,但我找不到如何做到这一点。有什么想法可以解决这个问题吗?

【问题讨论】:

    标签: concurrency erlang


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2017-12-06
      相关资源
      最近更新 更多