2012-03-25 113 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