【问题标题】:Erlang program faster with tracingErlang 程序的跟踪速度更快
【发布时间】:2013-03-17 07:52:24
【问题描述】:

我正在对程序进行一些评估测量,以测试执行时间以及检查原始系统执行的跟踪器如何影响原始系统的性能。跟踪程序不干扰系统,并且它们之间除了接收跟踪消息外不进行任何通信。

到目前为止,我得到的结果是未打开跟踪的程序的平均 953.14 微秒与打开跟踪的 937 微秒相比。使用statistics(wall_clock)函数计算时间。

我的想法是,由于我有一个来自跟踪器的额外进程,并且跟踪机制需要它们自己的处理能力,因此它会减慢系统速度而不是加快系统速度。有什么已知的原因会发生这种情况吗?

【问题讨论】:

    标签: performance erlang


    【解决方案1】:

    您是否运行过一次或多次测量?当您使用 wall_clock 时,您将在此测量中包括对环境的潜在扰动,等待消息...,并且您没有评估 CPU 时间。下面的例子展示了它:

    1> F = fun() -> receive _ -> ok after 5000 -> timout end end.
    #Fun<erl_eval.20.111823515>
    2> F().
    timout
    3> statistics(wall_clock),F(),statistics(wall_clock).       
    {965829,5016}
    4>
    

    函数F显然不需要5秒的CPU时间,只是等待5秒。

    这意味着你应该多次测量,一般不要使用第一次执行时间,可能包括加载模块代码的必要时间,并注意环境 - 其他进程在同一运行机器,并确保测量的时间不是等待状态的结果。

    如果您使用 runtime 而不是 wall_clock,您应该会看到所需的 CPU 时间,因此在跟踪代码时会增加时间。请注意,使用多核可能会隐藏这种时间增加。

    【讨论】:

    • 我为每个设置运行了 9 次测量,问题与这 9 次的平均时间有关。您是否建议我使用runtime 而不是wall_clock?我在多核系统上运行测量。
    • 使用运行时,您将获得运行代码的每个核心活动的总和。使用此选项,您应该了解跟踪选项成本。正如我在回答中所说,您将获得的额外成本将至少部分隐藏在多核系统上的并发执行中。
    猜你喜欢
    • 2014-10-10
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2020-05-20
    • 2016-04-27
    • 1970-01-01
    相关资源
    最近更新 更多