2013-12-22 3 views
2

Скажем, мы хотим вычислить разницу между двумя отметкой времени:Эффективное выполнение операций на Erlang кортежей

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

Нет, нет более эффективного способа. См главным же образом реализуется timer:now_diff/2 в 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. 
+0

Это позор, тем более, что было бы полезно во многих случаях. –

+0

@CharlesO: Я не понимаю, он производит довольно эффективный итоговый байт-код. –

+0

Очень эффективный байтовый код да ... но не такой красивый, как просто запись T2-T1, особенно когда T1 и T2 имеют одинаковую структуру, и оператор (+ или -) может применяться к каждому соответствующему элементу. –

1

Если вам нужно только сравнение:

1> {1387,611383,156575} > {1387,611376,335905}. 
true 
Смежные вопросы