在erlang中计算函数

时间:2014-12-25 14:40:44

标签: performance datetime erlang

我正在尝试编译以下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模块。

1 个答案:

答案 0 :(得分:1)

这是erlang if表达式

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

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

   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.

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

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}.