2012-03-25 11 views
0

Ich habe diese Funktion:erlang for-Schleife für Abfragen

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

Was sie tut, ist, dass es auf eine Tabelle mit dem Namen Mitarbeiter geht und druckt die Inhalte an den Benutzer.

Konzept: Ich möchte eine andere Funktion sagen sagen show(times) -->, diese Funktion wird einen Tabellennamen und die Anzahl der Aufrufe der Show_table-Funktion.

Wenn ich (Mitarbeiter, 100) eingeben, möchte ich eine for-Schleife, die 100 Mal ausgeführt wird, die Idee ist, die Zeit zu messen, die zum Ausführen der Schleife benötigt wird. In Java würde ich so etwas tun:

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; 

Das ist, wie ich es tun wollen, aber in erlang. Ich kenne einfach nicht die Syntax in Erlang und ich würde es schätzen, wenn mir jemand helfen kann.

Antwort

3

Für die Zeitmessung, Verwendung: timer:tc/1, timer:tc/2, timer:tc/3. Also werden wir eine rekursive Funktion namens loop haben, die alles tun kann, was Sie wollen. Dann würden wir die Zeit messen, es zu Schleife nimmt durch

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

Args beantragt, muss eine Liste der Argumente der Funktion sein sagen, einem Tisch und einer Anzahl, wie diese

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

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

Das ist die richtige erlang Umsetzung Dein Java-Code. Folgen Sie dem Link zur Timing-Funktion, um zu sehen, in welchen Einheiten die Uhrzeit zurückgegeben wird.

+1

ok danke Muzaaya, ich werde dir in meinem Bestätigungsabschnitt schreiben, wenn das alles erledigt ist, hast du mir viel geholfen – Onty

+0

du bist willkommen –

1

Erlang hat keine Schleifen wie Java. Stattdessen würden Sie Rekursion verwenden. ZB:

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

Sie würden für jeden Schritt cont nach unten, und wenn du 0 erreichen Sie fertig sind ..

Wenn Sie alot das Sie eine Funktion für sie machen könnte:

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

Nennen sie es wie folgt aus:

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

ich das mal ein implementieren wird versuchen und geben u Feedback, danke für die Antwort – Onty

+0

ich diese Funktion zu implementieren versucht, und ich habe nicht den Ausgang bekommen, das ist, wie ich es geschrieben: ** %% für die Schleife mal (_, 0) -> fertig; mal (Call, Times) -> Call(), mal (Call, Times - 1). %% Aufruf es Schleife (N) -> mal (Spaß() -> show_employee_table() Ende, N). ** Projekt: Start(). ok 6> projekt: write_tables(). {atomar, ok} 7> project: show_employee_table(). [{angestellter, 7, "Lana", 1, weiblich, 99143}, {angestellter, 5, "Antonio", 2, männlich, 99514}] 8> project: looping (5). getan Ich hatte erwartet, die Ausgabe der show_employees_table(), 5-mal zu sehen, können Sie helfen? – Onty

+0

wrap your do (..) so: io: format ("% s", [do (...)]). – barsju