2012-03-25 80 views
0

我有这样的功能:二郎for循环查询

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

它所做的是,它关系到一个表叫员工和打印的内容给用户。

概念:我想做另一个功能,叫做show(times) -->,这个函数将取一个表名和调用show_table函数的次数。

如果我输入(雇员,100),我想有一个循环运行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。我只是不知道erlang的语法,如果有人能帮助我,我将不胜感激。

回答

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). 

这是正确的Erlang实施你的java代码。按照定时功能的链接查看返回时间的单位。

+1

好的谢谢穆扎亚,当我完成所有工作后,我会在你的确认部分给你写信,你帮了我很多 – Onty 2012-03-26 19:03:37

+0

欢迎你 – 2012-03-27 06:41:06

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). 
+0

,我将尽力落实时代之一,并给ü反馈,谢谢大家的响应 – Onty 2012-03-25 18:56:13

+0

我想实现这个功能,我不得到输出,这是我写的: ** %%的循环 次(_,0) - >完成; (Call,Times - ) Call(), times(Call,Times - 1)。 %%调用它 循环(N) - > times(fun() - > show_employee_table()end,N)。 ** project:start()。 ok 6> project:write_tables()。 {atomic,ok} 7> project:show_employee_table()。 {{employee,7,“Lana”,1,female,99143}, {employee,5,“Antonio”,2,male,99514}] 8> project:looping(5)。 done 我期待看到show_employees_table()的输出,5次,你能帮忙吗? – Onty 2012-03-25 20:04:21

+0

包装你的do(..)像这样:io:format(“%s”,[do(...)])。 – barsju 2012-03-25 20:56:53