在Erlang Tuples上有效地执行操作

时间:2013-12-22 12:17:54

标签: 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} - {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>

除了减去每个相应的元素之外,还有一种更有效(优雅)的方法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

不,没有更有效的方法。主要参见stdlib中实施timer:now_diff/2的相同方式:

%%
%% 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 :(得分:1)

如果您只需要比较:

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