在Erlang元组上高效执行操作

在Erlang元组上高效执行操作,erlang,tuples,Erlang,Tuples,假设我们希望计算两个时间戳之间的差值: 66> T0=now(). {1387,611376,335905} 67> T1=now(). {1387,611383,156575} 68> T1-T0. ** exception error: an error occurred when evaluating an arithmetic expression in operator -/2 called as {1387,611383,156575}

假设我们希望计算两个时间戳之间的差值:

66> T0=now().
{1387,611376,335905}
67> T1=now().
{1387,611383,156575}
68> T1-T0.
** exception error: an error occurred when evaluating an arithmetic expression
     in operator  -/2
        called as {1387,611383,156575} - {1387,611376,335905}
69> {A1,A2,A3}=T0.
{1387,611376,335905}
70> {B1,B2,B3}=T1.
{1387,611383,156575}
71> Diff=(B1-A1)*1000000000000+(B2-A2)*1000000+(B3-A3).
6820670
72>
有没有比减去每个对应元素更有效(优雅)的方法


谢谢

不,没有比这更有效的方法了。请参见
stdlib
中实现的基本相同方式:

%%
%% Calculate the time difference (in microseconds) of two
%% erlang:now() timestamps, T2-T1.
%%
-spec now_diff(T2, T1) -> Tdiff when
      T1 :: erlang:timestamp(),
      T2 :: erlang:timestamp(),
      Tdiff :: integer().
now_diff({A2, B2, C2}, {A1, B1, C1}) ->
    ((A2-A1)*1000000 + B2-B1)*1000000 + C2-C1.

如果您只需要比较:

1> {1387,611383,156575} > {1387,611376,335905}.
true

这太可惜了,尤其是因为它在很多情况下都会有帮助。@CharlesO:我不明白,它会产生相当高效的结果字节码。非常高效的字节码是的。。。但这并不像简单地编写T2-T1那么漂亮,特别是当T1和T2是完全相同的结构,并且运算符(+或-)可以应用于每个对应的元素时。它主要是
列表到元组([A-B | |{A,B}你不知道T1和T2在编译时是完全相同的结构。在运行时这样做效率不高,但更重要的是,减去元组也可能是错误的。在智能运行时这样做是非常危险的。如果你喜欢这种智能,可以使用Perl。我已经用Perl写了数十万行从专业角度来说,我唯一能说的就是:Erlang是一种动态的强类型语言,它有利于可靠性、安全性和安全性。