70
68
-ifndef(MEASURE_CODECS).
71
-define(MEASURE_CODECS, [pretty, compact, per, ber, erlang]).
72
%% -define(MEASURE_CODECS, [pretty, compact]).
69
-define(MEASURE_CODECS, megaco_codec_transform:codecs()).
75
-record(stat, {file, ecount, etime, dcount, dtime, size}).
72
-define(DEFAULT_MESSAGE_PACKAGE, megaco_codec_transform:default_message_package()).
74
-record(stat, {name, ecount, etime, dcount, dtime, size}).
78
77
%% Runs the measurement on all "official" codecs
81
80
put(everbose,true),
100
t([pretty, compact]).
84
meas_init(?DEFAULT_MESSAGE_PACKAGE, ?MEASURE_CODECS).
86
start([MessagePackage]) ->
87
do_start(MessagePackage, ?MEASURE_CODECS);
88
start(MessagePackage) ->
89
do_start(MessagePackage, ?MEASURE_CODECS).
91
do_start(MessagePackageRaw, Codecs) ->
92
MessagePackage = parse_message_package(MessagePackageRaw),
93
meas_init(MessagePackage, Codecs).
95
parse_message_package(MessagePackageRaw) when is_list(MessagePackageRaw) ->
96
list_to_atom(MessagePackageRaw);
97
parse_message_package(MessagePackage) when is_atom(MessagePackage) ->
99
parse_message_package(BadMessagePackage) ->
100
throw({error, {bad_message_package, BadMessagePackage}}).
109
103
%% Dirs is a list of directories containing files,
217
228
t1([], Results) ->
218
229
lists:reverse(Results);
219
t1([{Dir, Codec, Conf, _} = EDir|Dirs], Results) ->
220
case (catch measure(EDir)) of
230
t1([{Id, Codec, Conf, _, _} = ECodec|EMsgs], Results) ->
231
case (catch measure(ECodec)) of
221
232
{'EXIT', Reason} ->
222
233
error("measure of codec ~p exited: ~n~p", [Codec, Reason]),
224
235
{error, Reason} ->
225
236
error("skipping codec ~p: ~n~p", [Codec, Reason]),
228
t1(Dirs, [{Dir, Conf, Res}| Results])
239
t1(EMsgs, [{Id, Conf, Res}| Results])
232
measure({Dir, Codec, Conf, Count}) when list(Dir) ->
243
measure({Id, Codec, Conf, Count, Msgs}) ->
233
244
io:format("measure using codec ~p ~p~n ", [Codec, Conf]),
234
245
{Init, Conf1} = measure_init(Conf),
235
246
Conf2 = [{version3,?V3}|Conf1],
236
Res = measure(Dir, Codec, Conf2, read_files(Dir), [], Count),
247
Res = measure(Id, Codec, Conf2, Msgs, [], Count),
237
248
measure_fin(Init),
241
expand_dirs([], EDirs) ->
242
lists:reverse(lists:flatten(EDirs));
243
expand_dirs([Dir|Dirs], EDirs) when atom(Dir) ->
244
EDir = expand_dir(atom_to_list(Dir)),
245
expand_dirs(Dirs, [EDir|EDirs]);
246
expand_dirs([Dir|Dirs], EDirs) when list(Dir) ->
247
EDir = expand_dir(Dir),
248
expand_dirs(Dirs, [EDir|EDirs]).
253
[{Dir, megaco_pretty_text_encoder, [flex_scanner], 3000},
254
{Dir, megaco_pretty_text_encoder, [], 1000}];
256
[{Dir, megaco_compact_text_encoder, [flex_scanner], 3000},
257
{Dir, megaco_compact_text_encoder, [], 1500}];
259
[{Dir, megaco_ber_bin_encoder, [driver,native], 4000},
260
{Dir, megaco_ber_bin_encoder, [native], 3000},
261
{Dir, megaco_ber_bin_encoder, [driver], 3000},
262
{Dir, megaco_ber_bin_encoder, [], 1000}];
264
[{Dir, megaco_per_bin_encoder, [driver,native], 4000},
265
{Dir, megaco_per_bin_encoder, [native], 3000},
266
{Dir, megaco_per_bin_encoder, [driver], 3000},
267
{Dir, megaco_per_bin_encoder, [], 1000}];
252
expand_messages(Codecs, Messages) ->
253
ECodecs = expand_codecs(Codecs, []),
254
expand_messages(ECodecs, Messages, []).
256
expand_messages([], _, EMessages) ->
257
lists:reverse(EMessages);
258
expand_messages([{Id, Codec, Conf, Count} | ECodecs], Messages, EMessages) ->
259
case lists:keysearch(Id, 1, Messages) of
260
{value, {Id, Msgs}} ->
261
expand_messages(ECodecs, Messages,
262
[{Id, Codec, Conf, Count, Msgs}|EMessages]);
264
exit({error, {no_such_codec_data, Id}})
267
expand_codecs([], ECodecs) ->
268
lists:reverse(lists:flatten(ECodecs));
269
expand_codecs([Codec|Codecs], ECodecs) when is_atom(Codec) ->
270
ECodec = expand_codec(Codec),
271
expand_codecs(Codecs, [ECodec|ECodecs]).
273
expand_codec(Codec) ->
276
[{Codec, megaco_pretty_text_encoder, [flex_scanner], 2000},
277
{Codec, megaco_pretty_text_encoder, [], 1000}];
279
[{Codec, megaco_compact_text_encoder, [flex_scanner], 3000},
280
{Codec, megaco_compact_text_encoder, [], 1500}];
282
[{Codec, megaco_ber_bin_encoder, [driver,native], 4000},
283
{Codec, megaco_ber_bin_encoder, [native], 3000},
284
{Codec, megaco_ber_bin_encoder, [driver], 3000},
285
{Codec, megaco_ber_bin_encoder, [], 1000}];
287
[{Codec, megaco_per_bin_encoder, [driver,native], 4000},
288
{Codec, megaco_per_bin_encoder, [native], 3000},
289
{Codec, megaco_per_bin_encoder, [driver], 3000},
290
{Codec, megaco_per_bin_encoder, [], 1000}];
270
{Dir, megaco_erl_dist_encoder, [megaco_compressed,compressed], 500},
271
{Dir, megaco_erl_dist_encoder, [compressed], 400},
272
{Dir, megaco_erl_dist_encoder, [megaco_compressed], 10000},
273
{Dir, megaco_erl_dist_encoder, [], 10000}
293
{Codec, megaco_erl_dist_encoder, [megaco_compressed,compressed], 500},
294
{Codec, megaco_erl_dist_encoder, [compressed], 400},
295
{Codec, megaco_erl_dist_encoder, [megaco_compressed], 10000},
296
{Codec, megaco_erl_dist_encoder, [], 10000}
276
299
exit({error, {invalid_codec, Else}})
281
case file:list_dir(Dir) of
288
303
measure_init([flex_scanner]) ->
289
304
start_flex_scanner();
290
305
measure_init(Conf) ->
291
306
{undefined, Conf}.
294
measure_fin(Pid) when pid(Pid) ->
309
measure_fin(Pid) when is_pid(Pid) ->
295
310
stop_flex_scanner(Pid),
297
312
measure_fin(_) ->
316
331
{ok, lists:reverse(Res)};
318
measure(Dir, Codec, Conf, [File|Files], Results, MCount) ->
319
io:format(" ~s", [File]),
320
case (catch do_measure(Dir, Codec, Conf, File, MCount)) of
333
measure(Dir, Codec, Conf, [{Name, Bin}|Msgs], Results, MCount) ->
334
io:format(" ~p", [Name]),
335
case (catch do_measure(Dir, Codec, Conf, Name, Bin, MCount)) of
322
measure(Dir, Codec, Conf, Files, [Stat | Results], MCount);
337
measure(Dir, Codec, Conf, Msgs, [Stat | Results], MCount);
325
io:format("~n~s failed: ~n", [File]),
340
io:format("~n~s failed: ~n", [Name]),
327
measure(Dir, Codec, Conf, Files, Results, MCount);
342
measure(Dir, Codec, Conf, Msgs, Results, MCount);
330
345
case get(verbose) of
332
347
io:format("~n", []),
335
io:format("~n~s skipped~n", [File])
350
io:format("~n~s skipped~n", [Name])
337
measure(Dir, Codec, Conf, Files, Results, MCount)
352
measure(Dir, Codec, Conf, Msgs, Results, MCount)
342
do_measure(Dir, Codec, Conf, File, MCount) ->
343
BinMsg = read_message(Dir, File),
357
do_measure(_Id, Codec, Conf, Name, BinMsg, MCount) ->
344
358
%% io:format("~n~s~n", [binary_to_list(BinMsg)]),
345
359
{Version, NewBin} = detect_version(Codec, Conf, BinMsg),
346
360
{Msg, Dcnt, Dtime} = measure_decode(Codec, Conf, Version, NewBin, MCount),
347
361
{_, Ecnt, Etime} = measure_encode(Codec, Conf, Version, Msg, MCount),
349
{ok, #stat{file = File,
350
% ecount = 1, etime = 1,
351
% dcount = 1, dtime = 1,
363
{ok, #stat{name = Name,
352
364
ecount = Ecnt, etime = Etime,
353
365
dcount = Dcnt, dtime = Dtime,
354
366
size = size(NewBin)}}.
356
read_message(Dir, FileName) ->
357
File = filename:join([Dir, FileName]),
358
case file:read_file_info(File) of
359
{ok, #file_info{size = Sz, type = regular}} when Sz > 0 ->
360
case file:read_file(File) of
362
%% io:format(".", []),
365
S = format("failed reading file ~s: ~p", [File, Reason]),
369
{ok, #file_info{type = regular}} ->
370
S = format("skipping empty file ~s", [File]),
373
{ok, #file_info{type = Type}} ->
374
S = format("skipping ~p file ~s", [Type, File]),
378
S = format("skipping file ~s~n~p", [File, Info]),
382
S = format("failed reading file info for ~s: ~p", [File, Reason]),
388
368
detect_version(Codec, Conf, Bin) ->
389
369
case (catch Codec:version_of(Conf, Bin)) of