假设您的数据库是mnesia,这应该不难.一种方法是具有写入功能和读取功能.但是,请注意有几个Activity access contexts与mnesia.要进行测试write times,您不应该使用上下文,transaction因为它甚至在发生光盘写入之前立即返回到调用进程.但是,对于光盘写入,重要的是要查看上下文:sync_transaction.这是一个例子:
write(Record)->
Fun = fun(R)-> mnesia:write(R) end,
mnesia:activity(sync_transaction,Fun,[Record],mnesia_frag).
只有当mnesia表的所有活动副本都将记录提交到数据光盘文件时,上述函数才会返回.因此,为了在流程增加时测试速度,你需要有a record generator,a a process spawner,write function最后a timing mechanism.对于计时,我们有一个内置函数调用:timer:tc/1, timer:tc/2 and timer:tc/3它返回执行(完全)给定函数所花费的确切时间.简而言之,我就是这样做的:
-module(stress_test). -compile(export_all).
-define(LIMIT,10000).
-record(book,{ isbn, title, price, version}).
%% ensure this table is {type,bag}
-record(write_time,{ isbn, num_of_processes, write_time }).
%% Assuming table (book) already exists %% Assuming mnesia running already
start()-> ensure_gproc(), tv:start(), spawn_many(?LIMIT).
spawn_many(0)-> ok; spawn_many(N)-> spawn(?MODULE,process,[]), spawn_many(N - 1).
process()-> gproc:reg({n, l,guid()},ignored), timer:apply_interval(timer:seconds(2),?MODULE,write,[]), receive <<"stop">> -> exit(normal) end.
total_processes()-> proplists:get_value(size,ets:info(gproc)) div 3.
ensure_gproc()-> case lists:keymember(gproc,1,application:which_applications()) of true -> ok; false -> application:start(gproc) end.
guid()-> random:seed(now()), MD5 = erlang:md5(term_to_binary([random:uniform(152629977),{node(), now(), make_ref()}])), MD5List = lists:nthtail(3, binary_to_list(MD5)), F = fun(N) -> f("~2.16.0B", [N]) end, L = [F(N) || N <- MD5List], lists:flatten(L).
generate_record()-> #book{isbn = guid(),title = guid(),price = guid()}.
write()-> Record = generate_record(), Fun = fun(R)-> ok = mnesia:write(R),ok end, %% Here is now the actual write we measure {Time,ok} = timer:tc(mnesia,activity,[sync_transaction,Fun,[Record],mnesia_frag]), %% The we save that time, the number of processes %% at that instant NoteTime = #write_time{ isbn = Record#book.isbn, num_of_processes = total_processes(), write_time = Time }, mnesia:activity(transaction,Fun,[NoteTime],mnesia_frag).
现在这里有依赖项,特别是:gproc下载并从此处将它构建到你的erlang lib路径下载Gproc.
要运行它,只需调用:stress_test:start(). 该表write_time将帮助您绘制进程数与写入时间的图表.随着进程数从0增加到上限(?LIMIT),我们注意到在给定时刻写入给定记录所花费的时间,并且我们还记录了当时的进程数.
f(S)-> f(S,[]). f(S,Args) -> lists:flatten(io_lib:format(S, Args)).这是缺失的功能.道歉....
write_time,使用应用程序tv,打开一个窗口,您可以在其中检查mnesia表.使用此表可以查看增加的写入时间/或降低性能,因为进程数会不时增加.time()这可能是重要的参数.您可以将其添加到表的表定义中write_time.