Facebook 开源了 Cinder,这是 Instagram 使用的 CPython 的一个分支

Facebook 发布了 Cinder 项目的源代码,它是 CPython 3.8.5 的一个分支,CPython 是 Python 编程语言的主要参考实现。 Cinder 在 Facebook 的生产基础设施中用于为 Instagram 提供支持,并包括提高性能的优化。

发布该代码是为了讨论将准备好的优化移植到主要 CPython 框架的可能性,并帮助其他涉及提高 CPython 性能的项目。 Facebook 并不打算以单独的开源项目的形式支持 Cinder,代码以在公司基础设施中使用的形式呈现,无需额外的梳理和文档。 他们也没有试图推广 Cinder 作为 CPython 的替代品——开发的主要目标是改进 CPython 本身的愿望。

Cinder 代码被认为相当可靠,并在生产环境中进行了测试,但如果发现问题,您将必须自己解决它们,因为 Facebook 不保证它将响应外部错误消息和拉取请求。 与此同时,Facebook 不排除与社区进行建设性合作,并准备讨论如何使 Cinder 更快或如何加快将准备好的更改转移到 CPython 主要部分的想法。

Cinder 中实现的主要优化:

  • 字节码的内联缓存(“影子字节码”)。 该方法的本质是识别执行可优化的典型操作码的情况,并用更快的专用选项动态替换此类操作码(例如,替换频繁调用的函数)。
  • 急切的协程评估。 对于立即处理的异步函数调用(await 不会导致等待,并且函数会更早到达 return 语句),此类函数的结果会被直接替换,而无需创建协程或涉及事件循环。 在大量使用 async/await 的 Facebook 代码中,优化带来了约 5% 的加速。
  • 在单个方法和函数(一次方法)级别进行选择性 JIT 编译。 通过“-X jit”选项或 PYTHONJIT=1 环境变量启用,允许您将许多性能测试的执行速度加快 1.5-4 倍。 由于 JIT 编译仅与频繁执行的函数相关,因此不建议将其用于很少使用的函数,其编译开销只会减慢程序执行速度。

    通过选项“-X jit-list-file=/path/to/jitlist.txt”或环境变量“PYTHONJITLISTFILE=/path/to/jitlist.txt”,您可以指定一个包含 JIT 函数列表的文件可以使用(路径格式 .to.module:funcname 或 path.to.module:ClassName.method_name)。 可以根据分析结果确定应启用 JIT 的函数列表。 根据内部对函数调用频率的分析,未来预计会支持动态 JIT 编译,但考虑到 Instagram 启动流程的具体情况,JIT 编译在初期也适合 Facebook。

    JIT首先将Python字节码转换为高级中间表示(HIR),它与Python字节码相当接近,但设计为使用基于寄存器的虚拟机而不是基于堆栈的虚拟机,并且还使用类型信息和附加信息性能关键细节(例如引用计数)。 然后,HIR 被转换为 SSA(静态单分配)形式,并执行考虑引用计数结果和内存消耗数据的优化步骤。 结果,生成了接近汇编语言的低级中间表示(LIR)。 在基于 LIR 的优化的另一个阶段之后,使用 asmjit 库生成汇编指令。

  • 模块的严格模式。 该功能包括三个组件: 类型 StrictModule。 静态分析器,可以确定模块的执行对该模块外部的代码没有影响。 一个模块加载器,确定模块处于严格模式(代码指定“import __strict__”),检查是否不存在与其他模块的交集,并将严格模块作为 StrictModule 对象加载到 sys.modules 中。
  • 静态 Python 是一种实验性字节码编译器,它使用类型注释来生成特定于类型的字节码,由于 JIT 编译,该字节码运行速度更快。 在某些测试中,静态 Python 和 JIT 的组​​合与标准 CPython 相比,性能提升高达 7 倍。 在许多情况下,估计结果与使用 MyPyC 和 Cython 编译器接近。

来源: opennet.ru

添加评论