timing_pb_encoding_test_... speed factor=35.95 [2.730 s] ok
So, the PB style encoding of the Mpb_LL_WriteProjectionReq message is about 35-36 times slower than using Erlang's term_to_binary() and binary_to_term(). {sigh}
This commit is contained in:
parent
5d8b648a24
commit
2763b16ca2
3 changed files with 40 additions and 3 deletions
|
@ -96,7 +96,7 @@ message Mpb_P_Srvr {
|
||||||
required string proto_mod = 2;
|
required string proto_mod = 2;
|
||||||
required string address = 3;
|
required string address = 3;
|
||||||
required string port = 4;
|
required string port = 4;
|
||||||
required bytes props = 5;
|
required bytes opaque_props = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////
|
//////////////////////////////////////////
|
||||||
|
|
|
@ -56,13 +56,13 @@ conv_from_p_srvr(#p_srvr{name=Name,
|
||||||
proto_mod=to_list(ProtoMod),
|
proto_mod=to_list(ProtoMod),
|
||||||
address=to_list(Address),
|
address=to_list(Address),
|
||||||
port=to_list(Port),
|
port=to_list(Port),
|
||||||
props=enc_sexp(Props)}.
|
opaque_props=enc_sexp(Props)}.
|
||||||
|
|
||||||
conv_to_p_srvr(#mpb_p_srvr{name=Name,
|
conv_to_p_srvr(#mpb_p_srvr{name=Name,
|
||||||
proto_mod=ProtoMod,
|
proto_mod=ProtoMod,
|
||||||
address=Address,
|
address=Address,
|
||||||
port=Port,
|
port=Port,
|
||||||
props=Props}) ->
|
opaque_props=Props}) ->
|
||||||
#p_srvr{name=to_atom(Name),
|
#p_srvr{name=to_atom(Name),
|
||||||
proto_mod=to_atom(ProtoMod),
|
proto_mod=to_atom(ProtoMod),
|
||||||
address=to_list(Address),
|
address=to_list(Address),
|
||||||
|
|
|
@ -210,5 +210,42 @@ bad_checksum_test() ->
|
||||||
ok = ?FLU:stop(FLU1)
|
ok = ?FLU:stop(FLU1)
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
%% The purpose of timing_pb_encoding_test_ and timing_bif_encoding_test_ is
|
||||||
|
%% to show the relative speed of the PB encoding of something like a
|
||||||
|
%% projection store command is about 35x slower than simply using the Erlang
|
||||||
|
%% BIFs term_to_binary() and binary_to_term(). We try to do enough work, at
|
||||||
|
%% least a couple of seconds, so that any dynamic CPU voltage adjustment
|
||||||
|
%% might kick into highest speed, in theory.
|
||||||
|
|
||||||
|
timing_pb_encoding_test_() ->
|
||||||
|
{timeout, 60, fun() -> timing_pb_encoding_test2() end}.
|
||||||
|
|
||||||
|
timing_pb_encoding_test2() ->
|
||||||
|
P_a = #p_srvr{name=a, address="localhost", port=4321},
|
||||||
|
P1 = machi_projection:new(1, a, [P_a], [], [a], [], []),
|
||||||
|
DoIt1 = fun() ->
|
||||||
|
Req = machi_pb_wrap:make_projection_req(
|
||||||
|
<<1,2,3,4>>, {write_projection, public, P1}),
|
||||||
|
Bin = list_to_binary(machi_pb:encode_mpb_ll_request(Req)),
|
||||||
|
ZZ = machi_pb:decode_mpb_ll_request(Bin),
|
||||||
|
_ = machi_pb_wrap:unmake_projection_req(ZZ)
|
||||||
|
end,
|
||||||
|
XX = lists:seq(1,30*1000),
|
||||||
|
erlang:garbage_collect(),
|
||||||
|
RUN1 = timer:tc(fun() -> begin [_ = DoIt1() || _ <- XX], ok end end),
|
||||||
|
erlang:garbage_collect(),
|
||||||
|
|
||||||
|
DoIt2 = fun() ->
|
||||||
|
Req = term_to_binary({
|
||||||
|
<<1,2,3,4>>, {write_projection, public, P1}}),
|
||||||
|
_ = binary_to_term(Req)
|
||||||
|
end,
|
||||||
|
erlang:garbage_collect(),
|
||||||
|
RUN2 = timer:tc(fun() -> begin [_ = DoIt2() || _ <- XX], ok end end),
|
||||||
|
erlang:garbage_collect(),
|
||||||
|
Factor = (element(1, RUN1) / element(1, RUN2)),
|
||||||
|
io:format(user, " speed factor=~.2f ", [Factor]),
|
||||||
|
ok.
|
||||||
|
|
||||||
-endif. % !PULSE
|
-endif. % !PULSE
|
||||||
-endif. % TEST
|
-endif. % TEST
|
||||||
|
|
Loading…
Reference in a new issue