首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写Erlang timeit函数

编写Erlang timeit函数
EN

Stack Overflow用户
提问于 2016-07-26 13:00:50
回答 2查看 594关注 0票数 3

我想编写一个Erlang timeit函数(像Python模块),作为一个学习练习,它告诉我一个特定函数运行了多长时间。问题是,我在Erlang是个菜鸟,不知道该怎么做。

尝试1(尝试制作一个累加器):

代码语言:javascript
复制
timeit_acc(T, start, F) -> timeit_acc({os:timestamp(), T}, finish, F);
timeit_acc({T1, T2}, finish, F) -> element(T1, 2) - element(T2, 2).
timeit(F) -> timeit_acc(os:timestamp(), start, F).

当然,这是行不通的,因为我不知道在哪里真正调用函数F。我也非常肯定这不是这段代码的唯一问题。:P

尝试2(尝试使一个函数执行几个语句,如Python):

代码语言:javascript
复制
timeit(F)->
    {M, S, MS} = os.timestamp(),
    F,
    {M2, S2, MS2} = os.timestamp(),
    {M2 - M1, S2- S1, MS2- MS1}.

我对第二次尝试很有希望,但碰到了下面的砖墙:

代码语言:javascript
复制
79> c(timeit).
timeit.erl:11: syntax error before: '.'
timeit.erl:3: function timeit/1 undefined
error

现在我已经考虑过了,当函数F有不同数量的参数时,我还想知道如何处理它。。。有人能告诉我怎么做吗?当然,稍微解释一下会很好。

====更新====

根据在评论中收到的建议,新的职能是:

代码语言:javascript
复制
timeit(F) ->
    {M, S, MS} = os:timestamp(),
    Val = F(),
    {M2, S2, MS2} = os:timestamp(),
    {{M2 - M, S2 - S, MS2 - MS}, Val}.

然而,现在我不知道如何使用它。我试图分析erlang:time/0函数,但失败了:

代码语言:javascript
复制
109> c(timeit).
{ok,timeit}
110> timeit:timeit(time).
** exception error: bad function time
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-26 13:31:12

你的第二次尝试非常接近。试着用这个

代码语言:javascript
复制
timeit(F,Args) ->
    {MS, S, US} = os:timestamp(),
    erlang:apply(F,Args),
    {MS2, S2, US2} = os:timestamp(),
    {MS2-MS,S2-S,US2-US}.

注意: erlang:apply/2允许您运行一个带有参数列表的函数。在上面的代码中,Args应该是一个包含函数F的所有参数的列表。例如,如果您想运行一个带有3个参数的函数,那么Args将是[Arg1,Arg2,Arg3]。(这也包括零参数)。见下面的例子。

示例:

代码语言:javascript
复制
3> testit:timeit(fun(X) -> X+X end, [5]).
{0,0,7}
4> testit:timeit(fun lists:append/2, [[1,2,3],[4,5,6]]).
{0,0,1}
5> testit:timeit(fun() -> io:format("Fun with no args~n",[]) end, []).
Fun with no args
{0,0,688}
票数 2
EN

Stack Overflow用户

发布于 2016-07-26 14:14:15

在尝试2中,函数调用看起来像os.timestamp,在模块名和函数名之间有一个点,类似于Python,但在Erlang中,应该是冒号:os:timestamp

在Erlang 18岁时,os:timestamp的另一种选择是erlang:monotonic_time。如果我正确理解文献资料,"Erlang单调时间“可能是您希望用来度量函数调用期间经过的时间的时间戳。

来自源代码

代码语言:javascript
复制
tc(F) ->
    T1 = erlang:monotonic_time(),
    Val = F(),
    T2 = erlang:monotonic_time(),
    Time = erlang:convert_time_unit(T2 - T1, native, micro_seconds),
    {Time, Val}.

erlang:monotonic_time()本身以未指定的“本机”时间单位中的整数形式返回时间戳。这就是为什么需要调用erlang:convert_time_unit,以便从native转换为micro_seconds。您还可以在获得时间戳的地方调用erlang:monotonic_time(micro_seconds)进行转换。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38590624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档