erlang for循环查询

时间:2012-03-25 18:10:16

标签: erlang mnesia

我有这个功能:

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

它的作用是进入一个名为employee的表,并将内容打印给用户。

概念:我想创建另一个名为show(times) -->的函数,此函数将采用表名和调用show_table函数的次数。

如果我输入(employee,100),我想要一个运行100次的for循环,我的想法是测量运行循环所需的时间。在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中。我只是不知道erlang中的语法,如果有人可以帮助我,我会很感激。

2 个答案:

答案 0 :(得分:3)

对于时间测量,请使用:timer:tc/1, timer:tc/2, timer: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).

这是您的java代码的正确erlang实现。按照定时功能的链接,查看返回时间的单位。

答案 1 :(得分:1)

Erlang没有像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).