Эрланг для цикла для запросов - PullRequest
0 голосов
/ 25 марта 2012

У меня есть эта функция:

show_employee_table() ->
    do(qlc:q([B || B <- mnesia:table(employee)])).

Что он делает, так это то, что он идет к таблице с именем employee и печатает содержимое для пользователя.

Концепция: я хочу сделать другую функцию, скажем, под названием show(times) -->, эта функция будет принимать имя таблицы и количество раз для вызова функции show_table.

Если я введу (employee, 100), я хочу, чтобы цикл for выполнялся 100 раз, идея состоит в том, чтобы измерить время, затраченное на выполнение цикла. В Java я бы сделал что-то вроде этого:

Time t = time.now();
for ( I=0; I<N; I++){
show_employee_table() ->
    do(qlc:q([B || B <- mnesia:table(employee)])).
}

Time t2 = time.now();

timetaken = t2 - t1;

Вот как я хочу это сделать, но на эрланге. Я просто не знаю синтаксис в erlang, и я был бы признателен, если бы кто-нибудь смог мне помочь.

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Для измерения времени используйте: таймер: tc / 1, таймер: tc / 2, таймер: tc / 3 .Поэтому у нас будет рекурсивная функция с именем loop, которая может делать все, что вы захотите.Затем мы измерили бы время, необходимое для цикла, применяя

{TimeTaken,Result} = timer:tc(?MODULE,loop,Args).

Args должен быть список аргументов функции скажем, таблицу и число, как это

measureLoopTime()->
   Args = [employee,100],
   {TimeTaken,_Result} = timer:tc(?MODULE,loop,Args),
   TimeTaken.

loop(_,0) -> done;
loop(Table,Number)->
  %%% do something ....
  loop(Table, Number - 1).

Это правильная реализация erlang вашего Java-кода.Перейдите по ссылке на функцию хронирования, чтобы узнать, в каких единицах возвращается время.

1 голос
/ 25 марта 2012

Эрланг не имеет петли, как Java.Вместо этого вы будете использовать рекурсию.Например:

show_employee_table(0) -> done;
show_employee_table(Times) ->
    do(qlc:q([B || B <- mnesia:table(employee)])),
    show_employee_table(Times - 1)
.

Для каждого шага вы будете вынуждены двигаться вниз, и когда вы достигнете 0, вы закончите ..

Если вы сделаете это много, вы можете сделать для него функцию:

times(_, 0) -> done;
times(Call, Times) ->
   Call(),
   times(Call, Times - 1)
.

Назовите это так:

   times(fun () ->  show_employee_table() end, N).
...