性能考量

IDLize 的目标是成为通用的跨语言互操作编译器,因此必须生成高性能的代码。

跨互操作边界传递数据有两种主要方法,它们在运行时性能特征方面有显著差异。

序列化是一种对称方法,其中一个运行时将其内部对象表示创建为另一个运行时可理解的 二进制形式的内存缓冲区,然后将内存传递给另一侧,另一侧从该缓冲区恢复其原生表示。

句柄传递是一种替代方法,将运行时特定的句柄连同运行时内省 API 一起传递给另一个运行时, 用于按需提取相关字段。

序列化更适合具有较高运行时边界穿越成本的高性能运行时, 而句柄传递更适合慢速运行时与快速运行时或原生代码互操作的场景 — 主要是在原生侧内省慢速运行时的方向上。

因此操作成本大约如下:

序列化:

[ 运行时 1 序列化 ] [ 调用开销 ] [ 运行时 2 反序列化 ]

句柄传递:

[ 调用开销 ] [ 运行时 2 对运行时 1 的内省开销 ]

一般来说,序列化受益于 VM 优化和更好的代码生成, 而句柄传递受益于更快的内省 API,这与优化 VM 行为在某种程度上相矛盾。

如果运行时 1 非常慢(例如解释型 JS VM),则句柄传递方案更可取, 而对于高度优化的 VM,序列化将提供更多优化机会。

慢速 VM:

[         序列化                                      ] [ 调用 ] [ 反序列化]
[ 调用 ] [                   VM 内省       ]


快速 VM:

[    序列化     ] [ 调用 ] [ 反序列化 ]
[ 调用  ]  [                   VM 内省       ]

带序列化和代码生成优化的快速 VM:

[ 序列化 ] [ 调用 ] [ 反序列化 ]
[ 调用  ]  [                   VM 内省        ]