-module(euphorik_test).
-export([
+ bench_write_minichat/1,
start/2,
stop/1,
bench_get_messages/0,
bench_get_messages_avec_2_conversations/0
]).
-include("../include/euphorik_bd.hrl").
+\r
+% les intervalles en seconde min en max entre deux postes de message d'un utilisateur\r
+% le temps d'attente est choisi au hasard entre ces deux valeurs\r
+-define(INTERVALLE_MIN, 2).\r
+-define(INTERVALLE_MAX, 5).
% N est le nombre d'utilisateur
stop(Pids) ->
lists:foreach(fun(Pid) -> exit(Pid, kill) end, Pids).
-
+% des trucs qui trainent
bench_get_messages() ->
T = [
{page,"chat"},
{conversations,{array,[]}}
],
moyenne_temps(euphorik_protocole, wait_event, [T], 20).
-
-
bench_get_messages_avec_2_conversations() ->
T = [
{page,"chat"},
]}}
],
moyenne_temps(euphorik_protocole, wait_event, [T], 20).
-
-
moyenne_temps(Module, Fun, Args, N) ->
moyenne_temps(Module, Fun, Args, N, N, 0).
moyenne_temps(_, _, _, 0, Total, Temps_acc) ->
% Tire au hasard de 0 à 3 messages sur les 10 derniers postés, renvoie une liste de int()
% répartition :
% 0 : 0.1
-% 1 : 0.7
-% 2 : 0.15
-% 3 : 0.05
+% 1 : 0.95
+% 2 : 0.04
+% 3 : 0.01
messages_id_rand() ->
R = random:uniform(),
if R =< 0.1 ->
true ->
Messages = lists:map(fun(#minichat{id = Id}) -> Id end, euphorik_bd:messages(8)),
if
- R > 0.1 andalso R =< 0.8 ->
+ R > 0.1 andalso R =< 0.95 ->
tire_element_rand(1, Messages);
- R > 0.8 andalso R =< 0.95 ->
+ R > 0.95 andalso R =< 0.99 ->
tire_element_rand(2, Messages);
true ->
tire_element_rand(3, Messages)
loop(User_id, 0) ->
io:format("~p a fini~n", [User_id]);
loop(User_id, M) ->
- % attend un temp aléatoire compris entre 2 sec et 10 sec
- timer:sleep(2000 * random:uniform(10)),
+ % attend un temp aléatoire compris entre INTERVALLE_MIN sec et INTERVALLE_MAX sec
+ timer:sleep(1000 * (random:uniform(?INTERVALLE_MAX - ?INTERVALLE_MIN + 1) + ?INTERVALLE_MIN - 1)),
% poste un message aléatoire par une personne aléatoire répondant à des messages aléatoires
{Message, Repond_a} = {message_rand(), messages_id_rand()},
- io:format("~p poste ~p et repond a ~w~n", [User_id, Message, Repond_a]),
+ % io:format("~p poste ~p et repond a ~w~n", [User_id, Message, Repond_a]),
case euphorik_bd:nouveau_message(Message, User_id, Repond_a) of
{erreur, E} ->
io:format("~p : erreur : ~p~n", [User_id, E]),
loop(User_id, M - 1)
end.
+
+% Permet de tester la vitesse d'écriture en fonction de la
+% taille de la BD
+% voir : http://erlang.org/pipermail/erlang-questions/2008-October/038697.html
+bench_write_minichat(Filename) ->
+ Times = bench_write_minichat(1, []),
+ {ok, File} = file:open(Filename, [write]),
+ lists:foreach(
+ fun({Id, Time}) ->
+ io:format(File, "~w ~w~n", [Id, Time])
+ end,
+ Times
+ ),
+ file:close(File).
+bench_write_minichat(100000, Temps) -> Temps;
+bench_write_minichat(N, Temps) ->
+ {T, _} = timer:tc(mnesia, transaction, [fun() ->
+ Id = mnesia:dirty_update_counter(counter, minichat, 1),
+ mnesia:write(#minichat{
+ id = Id,
+ auteur_id = random:uniform(10000),
+ date = now(),
+ pseudo = "Test",
+ contenu = "Blabla blabla bla.",
+ racine_id = random:uniform(10000)
+ })
+ end]),
+ bench_write_minichat(N + 1, if N rem 500 =:= 0 -> [{N, T} | Temps]; true -> Temps end).
+
+
+
\ No newline at end of file