我有这个功能:
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中的语法,如果有人可以帮助我,我会很感激。
答案 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).