查看源代码 性能比较
编码器/解码器比较
Megaco/H.248 标准定义了纯文本编码和二进制编码 (ASN.1 BER),我们已经实现了两者的编码器和解码器。我们提供了许多不同的编码/解码模块,用户实际上可以实现自己的模块(例如我们的 erl_dist 模块)。使用非标准的编码格式有其明显的缺点,但在某些配置中可能有用。
为了比较我们不同的编码器/解码器,我们对 Megaco/H.248 协议栈的 Erlang/OTP 实现进行了四种不同的测量。每种测量的结果总结在下表中。
编解码器和配置 | 大小 | 编码 | 解码 | 总计 |
---|---|---|---|---|
美化 | 336 | 5 | 12 | 17 |
美化 [flex] | 336 | 5 | 11 | 16 |
紧凑 | 181 | 4 | 10 | 14 |
紧凑 [flex] | 181 | 4 | 9 | 13 |
per bin | 91 | 6 | 6 | 12 |
per bin [原生] | 91 | 4 | 3 | 7 |
ber bin | 165 | 6 | 6 | 12 |
ber bin [原生] | 165 | 4 | 3 | 7 |
erl_dist | 875 | 2 | 5 | 7 |
erl_dist [megaco_compressed] | 405 | 1 | 2 | 3 |
erl_dist [compressed] | 345 | 15 | 9 | 24 |
erl_dist [megaco_compressed,compressed] | 200 | 11 | 4 | 15 |
表:编解码器性能
编码器/解码器描述
在 Megaco/H.248 规范(RFC 3525)的附录 A 中,有大约 30 条消息展示了一个典型的呼叫流程。我们还添加了一些额外的版本 1、版本 2 和版本 3 消息。我们使用这些消息作为测量的基础。我们的数据没有根据媒体网关及其控制器之间发送的不同类型消息的频率进行加权。
测试比较了以下编码器/解码器
- 美化 - 美化打印的文本。在文本编码中,协议栈的实现者可以选择使用短关键字和长关键字的混合。也可以添加空格来提高可读性。美化文本编码使用长关键字和类似于 Megaco/H.248 规范中的文本示例的缩进样式。
- 紧凑 - 紧凑文本编码使用尽可能短的关键字,并且没有可选的空格。
- ber - ASN.1 BER。
- per - ASN.1 PER。未被标准化为有效的 Megaco/H.248 编码,但为了完整性而包含,因为其编码非常紧凑。
- erl_dist - Erlang 的原生分发格式。未被标准化为有效的 Megaco/H.248 编码,但由于其众所周知的性能特征而被包含作为参考。Erlang 是一种动态类型语言,任何 Erlang 数据结构都可以通过使用内置函数序列化为 erl_dist 格式。
实际编码的消息已经收集在每个编码类型的一个目录中,每个目录包含每个编码消息的一个文件。
下面是一个文本消息的示例,以感受美化版本和紧凑版本的文本消息之间的差异。首先是美化打印的,缩进良好的版本,带有长关键字
MEGACO/1 [124.124.124.222]
Transaction = 9998 {
Context = - {
ServiceChange = ROOT {
Services {
Method = Restart,
ServiceChangeAddress = 55555,
Profile = ResGW/1,
Reason = "901 MG Cold Boot"
}
}
}
}
然后是紧凑的文本版本,没有缩进,带有短关键字
!/1 [124.124.124.222] T=9998{
C=-{SC=ROOT{SV{MT=RS,AD=55555,PF=ResGW/1,RE="901 MG Cold Boot"}}}}
设置
测量是在配备 Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz、40 GB 内存,运行 Ubuntu 20.04 x86_64,内核 5.4.0-91-generic 的 Dell Precision 5550 笔记本电脑上进行的。软件版本为开源 OTP 24.2 (megaco-4.2)。
总结
在我们的测量中,我们看到 ASN.1 BER 和紧凑文本格式之间的消息大小没有显着差异。使用美化文本样式(在协议规范中包含的所有示例中使用,并且在调试会话期间首选)时应谨慎,因为消息可能会非常大。如果消息大小确实是一个严重的问题,则应使用我们的 per 编码器,因为 ASN.1 PER 格式比所有其他替代方案都紧凑得多。其主要缺点是它尚未被批准为有效的 Megaco/H.248 消息编码。
当涉及到纯粹的编码/解码性能时,结果表明
- 我们最快的二进制编码器 (ber) 大约等于我们最快的文本编码器(紧凑)。
- 我们最快的二进制解码器 (ber) 比我们最快的文本解码器(紧凑)快约 66%。
如果纯粹的编码/解码性能确实是一个严重的问题,可以使用我们的 erl_dist 编码器,因为 erlang 分发格式的编码/解码比所有其他替代方案快得多。其主要缺点是它尚未被批准为有效的 Megaco/H.248 消息编码。
构建(和使用)非可重入的 flex 扫描器比可重入的 flex 扫描器(如果 flex 支持构建此类扫描器)没有性能优势。
注意
请注意,这些性能数据与我们在 Erlang/OTP 中的实现相关。使用其他工具和技术进行的测量可能会得出其他数据。