【问题标题】:Time a function in erlang在erlang中为函数计时
【发布时间】:2015-02-23 05:40:54
【问题描述】:

我正在尝试编译以下 erlang 代码:

   my_time_func(F) ->
    {Mega, Mini, Micro} = now(),
    F,
    {SMega,SMini,SMicro} = now(),
    {FMega,FMini,FMicro} = {SMega - Mega, SMini - Mini, SMicro - Micro},
    if 
        FMicro < 0 ->  %guard 1
                if 
                    FMini - 1 < 0 -> {FMega - 1, FMini, FMicro + (FMicro * 2) + 1};
                    true > 0 -> {FMega, FMini - 1, FMicro + (FMicro * 2) + 1};
                end;
        true ->  %guard 2
                if 
                    FMini < 0 -> {FMega - 1, FMini + (FMini * 2) + 1, FMicro} ;
                    true > 0 -> {FMega,FMini,FMicro} ;
                end;
    end.

但是它说我在第 19 行结束之前有一个语法错误(这是第一个结束)。我错过了某种分号吗?

最初我打算在代码审查中发布这个,因为这个代码非常“丑陋”。有没有更好的方法来做这样的事情? (定时函数)不使用内置函数,最好单独使用 erlang 模块。

【问题讨论】:

  • 另一种解决方案是使用timer 模块中的函数,timer:tc/1/2/3 完成所有操作,或者如果您只想要时差,则使用timer:now_diff/2

标签: performance datetime erlang


【解决方案1】:

这里是 erlang if 表达式

if
    GuardSeq1 ->
        Body1;
    ...;
    GuardSeqN ->
        BodyN
end

因此,您需要在属于if表达式的end之前删除;,固定版本如下;

   my_time_func(F) ->
    {Mega, Mini, Micro} = now(),
    F,
    {SMega,SMini,SMicro} = now(),
    {FMega,FMini,FMicro} = {SMega - Mega, SMini - Mini, SMicro - Micro},
    if 
        FMicro < 0 ->  %guard 1
                if 
                    FMini - 1 < 0 -> {FMega - 1, FMini, FMicro + (FMicro * 2) + 1};
                    true > 0 -> {FMega, FMini - 1, FMicro + (FMicro * 2) + 1}
                end;
        true ->  %guard 2
                if 
                    FMini < 0 -> {FMega - 1, FMini + (FMini * 2) + 1, FMicro} ;
                    true > 0 -> {FMega,FMini,FMicro} 
                end
    end.

关于问题的第二部分,以微秒为单位取两个timestamps 的差可能是另一种方式,例如;

now_diff({Meg2, Sec2, Mic2}, {Meg1, Sec1, Mic1}) ->
    ((Meg2 * 1000000 + Sec2) * 1000000 + Mic2) - ((Meg1 * 1000000 + Sec1) * 1000000 + Mic1).

my_time_func(F) ->
    T1 = now(),
    F(),
    T2 = now(),
    Diff = now_diff(T2, T1),
    {Diff div 1000000000000, (Diff rem 1000000000000) div 1000000, Diff rem 1000000}.

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 2013-01-08
    • 1970-01-01
    • 2015-09-17
    • 2012-03-16
    • 2016-11-24
    • 2023-03-08
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多