1
<?xml version="1.0" encoding="latin1" ?>
2
<!DOCTYPE chapter SYSTEM "chapter.dtd">
7
<year>2002</year><year>2009</year>
8
<holder>Ericsson AB. All Rights Reserved.</holder>
11
The contents of this file are subject to the Erlang Public License,
12
Version 1.1, (the "License"); you may not use this file except in
13
compliance with the License. You should have received a copy of the
14
Erlang Public License along with this software. If not, it can be
15
retrieved online at http://www.erlang.org/.
17
Software distributed under the License is distributed on an "AS IS"
18
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
19
the License for the specific language governing rights and limitations
24
<title>Performace comparison</title>
25
<prepared>Håkan Mattsson</prepared>
26
<responsible>Håkan Mattsson</responsible>
28
<approved>Håkan Mattsson</approved>
30
<date>2007-06-15</date>
32
<file>megaco_performance.sgml</file>
36
<title>Comparison of encoder/decoders</title>
37
<p>The Megaco/H.248 standard defines both a plain text encoding and a
38
binary encoding (ASN.1 BER) and we have implemented encoders and
39
decoders for both. We do supply a bunch of different encoding/decoding
40
modules and the user may in fact implement their own (like our erl_dist
41
module). Using a non-standard encoding format has its obvious drawbacks,
42
but may be useful in some configurations.</p>
43
<p>We have made four different measurements of our Erlang/OTP
44
implementation of the Megaco/H.248 protocol stack, in order to compare
45
our different encoders/decoders. The result of each one is summarized
49
<title>Encoded message size in bytes</title>
50
<image file="message_size">
51
<icaption>Encoded message size in bytes</icaption>
56
<title>Encode time in micro seconds</title>
57
<image file="encode_time">
58
<icaption>Encode time in micro seconds</icaption>
63
<title>Decode time in micro seconds</title>
64
<image file="decode_time">
65
<icaption>Decode time in micro seconds</icaption>
70
<title>Sum of encode and decode time in micro seconds</title>
71
<image file="total_time">
72
<icaption>Sum of encode and decode time in micro seconds</icaption>
78
<title>Description of encoders/decoders</title>
79
<p>In Appendix A of the Megaco/H.248 specification (RFC 3525), there are
80
about 30 messages that shows a representative call flow. We have also
81
added a few extra version 1, version 2 and version 3 messages.
82
We have used these messages as basis for our measurements.
83
The numbers within parentheses are the plain average values. Our
84
figures have not been weighted in regard to how frequent the different
85
kinds of messages that are sent between the media gateway and its
87
<p>The test compares the following encoder/decoders:</p>
88
<list type="bulleted">
90
<p><em>pretty</em> - pretty printed text. In the text encoding,
91
the protocol stack implementors have the choice of using a
92
mix of short and long keywords. It is also possible to add
93
white spaces to improve readability. The pretty text encoding
94
utilizes long keywords and an indentation style like the
95
text examples in the Megaco/H.248 specification.</p>
98
<p><em>compact</em> - the compact text encoding uses the shortest
99
possible keywords and no optional white spaces.</p>
102
<p><em>ber</em> - ASN.1 BER.</p>
105
<p><em>per</em> - ASN.1 PER. Not standardized as a valid
106
Megaco/H.248 encoding, but included for the matter of completeness
107
as its encoding is extremely compact.</p>
110
<p><em>erl_dist</em> - Erlang's native distribution format. Not
111
standardized as a valid Megaco/H.248 encoding, but included
112
as a reference due to its well known performance characteristics.
113
Erlang is a dynamically typed language and any Erlang data
114
structure may be serialized to the erl_dist format by using
115
built-in functions.</p>
118
<p>The actual encoded messages have been collected in one directory per
119
encoding type, containing one file per encoded message.</p>
120
<p>Here follows an example of a text message to give a feeling of the
121
difference between the pretty and compact versions of text messages.
122
First the pretty printed, well indented version with long keywords:</p>
125
MEGACO/1 [124.124.124.222]
128
ServiceChange = ROOT {
130
\011 Method = Restart,
131
\011 ServiceChangeAddress = 55555,
132
\011 Profile = ResGW/1,
133
\011 Reason = "901 MG Cold Boot"
138
<p>Then the compact text version without indentation and with short
141
!/1 [124.124.124.222] T=9998{
142
C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 MG Cold Boot"}}}} </pre>
147
<p>The measurements has been performed on a
148
HP workstation xw4400 with
149
an Intel Core 2 Duo 2.13 GHz,
151
running SLES 10 SP1 i586, kernel 2.6.16.54-0.2.5-bigsmp
152
Software versions was open source OTP R12B-2 and megaco-3.8
153
(R12B-1 and megaco-3.7.3).</p>
157
<title>Complete measurement result</title>
158
<p>This chapter details the effects of the possible encoding
159
configurations for every codec. The result above are the fastest
160
of these configurations for each codec. The figures presented are
161
the average of all used messages.</p>
162
<p>For comparison, also included are performance figures for when both
163
the test program and the codec's where <c>hipe compiled</c>. In the case
164
of the binary codec's, the asn1 run-time was also <c>inlined</c>. </p>
168
<cell align="left" valign="middle"><em>Codec and config</em></cell>
169
<cell align="center" valign="middle"><em>Size</em></cell>
170
<cell align="center" valign="middle"><em>Encode</em></cell>
171
<cell align="center" valign="middle"><em>Decode</em></cell>
172
<cell align="center" valign="middle"><em>Total</em></cell>
177
<cell align="left" valign="middle">pretty</cell>
178
<cell align="right" valign="middle">336</cell>
179
<cell align="right" valign="middle">30 (31)</cell>
180
<cell align="right" valign="middle">98 (115)</cell>
181
<cell align="right" valign="middle">129 (146)</cell>
184
<cell align="left" valign="middle">pretty [flex]</cell>
185
<cell align="right" valign="middle">336</cell>
186
<cell align="right" valign="middle">31 (31)</cell>
187
<cell align="right" valign="middle">53 (60)</cell>
188
<cell align="right" valign="middle">84 (91)</cell>
191
<!-- PRETTY + HIPE -->
193
<cell align="left" valign="middle"><c>pretty hipe</c></cell>
194
<cell align="right" valign="middle"><c>336</c></cell>
195
<cell align="right" valign="middle"><c>18 (18)</c></cell>
196
<cell align="right" valign="middle"><c>50 (58)</c></cell>
197
<cell align="right" valign="middle"><c>68 (76)</c></cell>
200
<cell align="left" valign="middle"><c>pretty [flex] hipe</c></cell>
201
<cell align="right" valign="middle"><c>336</c></cell>
202
<cell align="right" valign="middle"><c>18 (18)</c></cell>
203
<cell align="right" valign="middle"><c>44 (51)</c></cell>
204
<cell align="right" valign="middle"><c>62 (69)</c></cell>
209
<cell align="left" valign="middle">compact</cell>
210
<cell align="right" valign="middle">181</cell>
211
<cell align="right" valign="middle">26 (26)</cell>
212
<cell align="right" valign="middle">80 (91)</cell>
213
<cell align="right" valign="middle">106 (117)</cell>
216
<cell align="left" valign="middle">compact [flex]</cell>
217
<cell align="right" valign="middle">181</cell>
218
<cell align="right" valign="middle">26 (26)</cell>
219
<cell align="right" valign="middle">49 (56)</cell>
220
<cell align="right" valign="middle">75 (82)</cell>
223
<!-- COMPACT + HIPE -->
225
<cell align="left" valign="middle"><c>compact hipe</c></cell>
226
<cell align="right" valign="middle"><c>181</c></cell>
227
<cell align="right" valign="middle"><c>13 (14)</c></cell>
228
<cell align="right" valign="middle"><c>45 (53)</c></cell>
229
<cell align="right" valign="middle"><c>58 (67)</c></cell>
232
<cell align="left" valign="middle"><c>compact [flex] hipe</c></cell>
233
<cell align="right" valign="middle"><c>181</c></cell>
234
<cell align="right" valign="middle"><c>13 (14)</c></cell>
235
<cell align="right" valign="middle"><c>39 (47)</c></cell>
236
<cell align="right" valign="middle"><c>52 (61)</c></cell>
241
<cell align="left" valign="middle">per bin</cell>
242
<cell align="right" valign="middle">91</cell>
243
<cell align="right" valign="middle">84 (82)</cell>
244
<cell align="right" valign="middle">86 (87)</cell>
245
<cell align="right" valign="middle">170 (169)</cell>
248
<cell align="left" valign="middle">per bin [driver]</cell>
249
<cell align="right" valign="middle">91</cell>
250
<cell align="right" valign="middle">57 (57)</cell>
251
<cell align="right" valign="middle">58 (59)</cell>
252
<cell align="right" valign="middle">115 (116)</cell>
255
<cell align="left" valign="middle">per bin [native]</cell>
256
<cell align="right" valign="middle">91</cell>
257
<cell align="right" valign="middle">64 (63)</cell>
258
<cell align="right" valign="middle">64 (63)</cell>
259
<cell align="right" valign="middle">127 (126)</cell>
262
<cell align="left" valign="middle">per bin [driver,native]</cell>
263
<cell align="right" valign="middle">91</cell>
264
<cell align="right" valign="middle">36 (35)</cell>
265
<cell align="right" valign="middle">37 (38)</cell>
266
<cell align="right" valign="middle">72 (73)</cell>
269
<!-- PER + HIPE + INLINE -->
271
<cell align="left" valign="middle"><c>per bin hipe+inline</c></cell>
272
<cell align="right" valign="middle"><c>91</c></cell>
273
<cell align="right" valign="middle"><c>38 (38)</c></cell>
274
<cell align="right" valign="middle"><c>40 (38)</c></cell>
275
<cell align="right" valign="middle"><c>78 (76)</c></cell>
278
<cell align="left" valign="middle"><c>per bin [driver] hipe+inline</c></cell>
279
<cell align="right" valign="middle"><c>91</c></cell>
280
<cell align="right" valign="middle"><c>33 (33)</c></cell>
281
<cell align="right" valign="middle"><c>33 (36)</c></cell>
282
<cell align="right" valign="middle"><c>66 (69)</c></cell>
285
<cell align="left" valign="middle"><c>per bin [native] hipe+inline</c></cell>
286
<cell align="right" valign="middle"><c>91</c></cell>
287
<cell align="right" valign="middle"><c>28 (28)</c></cell>
288
<cell align="right" valign="middle"><c>30 (29)</c></cell>
289
<cell align="right" valign="middle"><c>58 (57)</c></cell>
292
<cell align="left" valign="middle"><c>per bin [driver,native] hipe+inline</c></cell>
293
<cell align="right" valign="middle"><c>91</c></cell>
294
<cell align="right" valign="middle"><c>22 (22)</c></cell>
295
<cell align="right" valign="middle"><c>25 (25)</c></cell>
296
<cell align="right" valign="middle"><c>47 (47)</c></cell>
301
<cell align="left" valign="middle">ber bin</cell>
302
<cell align="right" valign="middle">165</cell>
303
<cell align="right" valign="middle">46 (45)</cell>
304
<cell align="right" valign="middle">71 (70)</cell>
305
<cell align="right" valign="middle">116 (115)</cell>
308
<cell align="left" valign="middle">ber bin [driver]</cell>
309
<cell align="right" valign="middle">165</cell>
310
<cell align="right" valign="middle">46 (45)</cell>
311
<cell align="right" valign="middle">51 (51)</cell>
312
<cell align="right" valign="middle">97 (96)</cell>
315
<cell align="left" valign="middle">ber bin [native]</cell>
316
<cell align="right" valign="middle">165</cell>
317
<cell align="right" valign="middle">26 (26)</cell>
318
<cell align="right" valign="middle">48 (47)</cell>
319
<cell align="right" valign="middle">74 (73)</cell>
322
<cell align="left" valign="middle">ber bin [driver,native]</cell>
323
<cell align="right" valign="middle">165</cell>
324
<cell align="right" valign="middle">26 (26)</cell>
325
<cell align="right" valign="middle">29 (28)</cell>
326
<cell align="right" valign="middle">54 (54)</cell>
329
<!-- BER + HIPE + INLINE -->
331
<cell align="left" valign="middle"><c>ber bin hipe+inline</c></cell>
332
<cell align="right" valign="middle"><c>165</c></cell>
333
<cell align="right" valign="middle"><c>24 (24)</c></cell>
334
<cell align="right" valign="middle"><c>41 (41)</c></cell>
335
<cell align="right" valign="middle"><c>65 (65)</c></cell>
338
<cell align="left" valign="middle"><c>ber bin [driver] hipe+inline</c></cell>
339
<cell align="right" valign="middle"><c>165</c></cell>
340
<cell align="right" valign="middle"><c>24 (24)</c></cell>
341
<cell align="right" valign="middle"><c>30 (30)</c></cell>
342
<cell align="right" valign="middle"><c>54 (54)</c></cell>
345
<cell align="left" valign="middle"><c>ber bin [native] hipe+inline</c></cell>
346
<cell align="right" valign="middle"><c>165</c></cell>
347
<cell align="right" valign="middle"><c>14 (14)</c></cell>
348
<cell align="right" valign="middle"><c>31 (31)</c></cell>
349
<cell align="right" valign="middle"><c>45 (45)</c></cell>
352
<cell align="left" valign="middle"><c>ber bin [driver,native] hipe+inline</c></cell>
353
<cell align="right" valign="middle"><c>165</c></cell>
354
<cell align="right" valign="middle"><c>14 (14)</c></cell>
355
<cell align="right" valign="middle"><c>20 (20)</c></cell>
356
<cell align="right" valign="middle"><c>34 (34)</c></cell>
361
<cell align="left" valign="middle">erl_dist</cell>
362
<cell align="right" valign="middle">875</cell>
363
<cell align="right" valign="middle">7 (7)</cell>
364
<cell align="right" valign="middle">13 (13)</cell>
365
<cell align="right" valign="middle">20 (20)</cell>
368
<cell align="left" valign="middle">erl_dist [megaco_compressed]</cell>
369
<cell align="right" valign="middle">405</cell>
370
<cell align="right" valign="middle">8 (8)</cell>
371
<cell align="right" valign="middle">9 (9)</cell>
372
<cell align="right" valign="middle">17 (17)</cell>
375
<cell align="left" valign="middle">erl_dist [compressed]</cell>
376
<cell align="right" valign="middle">345</cell>
377
<cell align="right" valign="middle">143 (142)</cell>
378
<cell align="right" valign="middle">31 (31)</cell>
379
<cell align="right" valign="middle">174 (173)</cell>
382
<cell align="left" valign="middle">erl_dist [megaco_compressed,compressed]</cell>
383
<cell align="right" valign="middle">200</cell>
384
<cell align="right" valign="middle">119 (111)</cell>
385
<cell align="right" valign="middle">17 (18)</cell>
386
<cell align="right" valign="middle">137 (129)</cell>
389
<!-- ERLANG + HIPE -->
391
<cell align="left" valign="middle"><c>erl_dist hipe</c></cell>
392
<cell align="right" valign="middle"><c>875</c></cell>
393
<cell align="right" valign="middle"><c>7 (7)</c></cell>
394
<cell align="right" valign="middle"><c>13 (13)</c></cell>
395
<cell align="right" valign="middle"><c>20 (20)</c></cell>
398
<cell align="left" valign="middle"><c>erl_dist [megaco_compressed] hipe</c></cell>
399
<cell align="right" valign="middle"><c>405</c></cell>
400
<cell align="right" valign="middle"><c>6 (6)</c></cell>
401
<cell align="right" valign="middle"><c>6 (6)</c></cell>
402
<cell align="right" valign="middle"><c>12 (12)</c></cell>
405
<cell align="left" valign="middle"><c>erl_dist [compressed] hipe</c></cell>
406
<cell align="right" valign="middle"><c>345</c></cell>
407
<cell align="right" valign="middle"><c>135 (130)</c></cell>
408
<cell align="right" valign="middle"><c>30 (29)</c></cell>
409
<cell align="right" valign="middle"><c>165 (159)</c></cell>
412
<cell align="left" valign="middle"><c>erl_dist [megaco_compressed,compressed] hipe</c></cell>
413
<cell align="right" valign="middle"><c>200</c></cell>
414
<cell align="right" valign="middle"><c>107 (108)</c></cell>
415
<cell align="right" valign="middle"><c>14 (14)</c></cell>
416
<cell align="right" valign="middle"><c>121 (122)</c></cell>
418
<tcaption>Codec performance</tcaption>
423
<title>Summary</title>
424
<p>In our measurements we have seen that there are no significant
425
differences in message sizes between ASN.1 BER and the compact
426
text format. Some care should be taken when using the pretty text
427
style (which is used in all the examples included in the protocol
428
specification and preferred during debugging sessions) since the
429
messages can then be quite large. If the message size really is a
430
serious issue, our per encoder should be used, as the ASN.1 PER
431
format is much more compact than all the other alternatives. Its
432
major drawback is that it is has not been approved as a valid
433
Megaco/H.248 message encoding.</p>
434
<p>When it comes to pure encode/decode performance, it turns out that:</p>
435
<list type="bulleted">
437
<p>our fastest binary encoder (ber) is about equal
438
to our fastest text encoder (compact). </p>
441
<p>our fastest binary decoder (ber) is about 26% (47%) faster than our
442
fastest text decoder (compact). </p>
445
<p>If the pure encode/decode performance really is a serious issue, our
446
erl_dist encoder could be used, as the encoding/decoding of the
447
erlang distribution format is much faster than all the other
448
alternatives. Its major drawback is that it is has not been approved
449
as a valid Megaco/H.248 message encoding.</p>
451
<p>Please, observe that these performance figures are related to our
452
implementation in Erlang/OTP. Measurements of other implementations
453
using other tools and techniques may of course result in other