Takashi Kokubun:如何使Ruby应用程序运行得更快

9月28日举行的俄罗斯中部红宝石会议标志着10年的历史。 今年, RubyRussia有了一个新的场所,多达4组精选报告,通讯流,当然还有传奇的聚会后流! 演讲者包括松本行弘,高角国文,泽维尔·诺里亚,尼克·萨特勒,Genadi Samokovarov等!

在准备过程中,我们与演讲者讨论了Ruby,工作和生活。 今天,我们发布了Dmitry MatveyevEvrone的项目经理)向Takashi Kokubun提问的材料。

图片
演讲者RubyRussia 2019是Ruby JIT编译器的优化程序,它支持ArmTreasure Data的后端工程师Haml和ERB。

告诉我,您的会议报告中将讨论什么?

关于在JIT编译器上的工作。 我想重点谈三点。 首先是函数内联。 该函数必须“干净”,且无副作用,以便其主体可以内联。 如果功能太多,编译器将开始缓慢运行。 我将描述如何解决此问题。
第二点涉及优化对象在内存中的放置。 在大型复杂的应用程序(如Rails)中,您需要在一个请求中创建许多对象。 如果优化此过程,则可以提高性能。 通常,对象是在堆中创建的。 因此,您必须在其中管理复杂的数据结构。 您还必须调用垃圾收集器以删除未使用的对象。 如果将对象放置在堆栈上,则只需在添加对象时增加堆栈指针,而在需要删除对象时减少堆栈指针。 使用堆栈本身存储对象的速度更快,而且垃圾收集器开始更快地工作。 但是为了使用堆栈,我们需要确保没有在其他地方使用对象。 为此,我们使用一种称为“逃逸分析”的技术。 我们需要分析每种方法,并确保其每个内部对象都不会在外部使用,并且不会作为当前方法的结果返回。 如果可以这样做,我们可以将对象放在堆栈上,这将提高生产率。 我的想法是为指令添加元数据。 现在这是一个实验,但是我将在不久的将来用此代码向主控人员提出请求。

第三点是关于优化JIT中的函数调用的分配。 当前,该过程产生强大的逻辑分支,这对处理器的分支预测机制产生了不利影响。 这减慢了整个处理器的速度。 我们需要简化此逻辑,即减少条件数量。 我目前正在探索如何执行此操作。

这是一份包含大量代码和概念的核心报告! 似乎很难?

我认为大多数人都不是自己实现编译器的,并且我理解了解这一点很困难。 但是,我将尝试通过示例和插图来尽可能简单地解释一切。 也就是说,我的报告应该对没有编译器开发经验的人可以理解。

现在可以在生产中使用新的编译器吗?在什么情况下可以使用?

目的是使RoR应用程序运行得更快。 例如,我目前的公司将从中受益。 但是我不会说一切都准备就绪。 事实证明,仅RoR应用并未得到特别加速。 这是因为此类应用程序通常很大,并且会生成许多C代码,从而导致处理器中缓存的使用效率低下。 我对如何解决此问题有一些想法。 这就是我现在正在研究的内容。 但是现在,我的编译器对于小型应用程序很有用。 例如,我知道使用karafka宝石比不使用karafka宝石更快。

我读到JIT编译器已经被注入到Ruby语言早午餐主版本中,并且从2.6版本开始就可用。 是这样吗

是的,我的合并请求已被接受。 但这是第一个版本,还有很多工作要做。 Ruby 2.7中将进行改进,而Ruby 3中将进行更多改进。

告诉我您是如何开始用Ruby编写的?

最初,我使用Objective-C,但我并不真正喜欢它。 一旦需要编写一个后端应用程序,朋友们建议尝试Ruby On Rails。 我就是这样做的-对结果感到非常满意! 我喜欢该语言的简单易懂的语法,并且开始更深入地研究和使用它。

您现在在用Ruby写作吗?

最近几年,我一直在Treasure Data工作。 它是一个跟踪客户端应用程序中的用户数据的平台。 该项目最初是用Ruby On Rails编写的,而我的帖子称为“ Ruby Developer”。 所以我在Ruby中写了很多东西。 但是现在我正在研究一些用Java和Kotlin编写的分布式服务,有时还使用Python。

Treasure Data项目与高负载和大数据相关联。 但是Ruby不是最快的语言。 您如何设法在RoR平台上创建可处理大数据的高负载应用程序?

该应用程序记录用户数据并将其保存在存储器中。 它还提供了用于以Hive和Presto等语言查询数据的界面以及管理面板。 将其全部写在轨道上不是问题。 另外,我们建立了称职的基础架构,并能够在高峰负载时增加内存和处理器资源。 Ruby的主要问题是它不适用于并行计算。 为此,我们必须使用Kotlin。

你为什么喜欢露比? 如果有一个可以同时在Ruby和Python中实现的项目,您会选择哪一个?

我喜欢干净的Ruby语法,它非常易读和直观。 这使您可以快速轻松地编写应用程序逻辑,这从业务角度来看很重要。 这是一种纯粹的目标语言,我非常感谢。 我有使用Python的经验,但是在我看来,它并不那么直观。 我只会为机器学习项目选择它。

您最近正在研究的另一件事是Haml模板引擎...

我在上一份工作中从事过Haml和ERB的工作。 现在,我并没有花太多时间在此上,但有时我会仔细研究这些项目中的拉式任务。

考虑到在现代世界中,趋势是将后面板和前面板完全分离成两个不同的应用程序,并将HTML页面完全交给JavaScript,您对总体而言,诸如Haml,Slim或ERB之类的模板引擎的前景如何看待? 也就是说,在这种配置下,模板引擎变得完全不必要了吗?

我同意,对于具有复杂用户界面的任务,有必要将此逻辑放在单独的应用程序中。 为了与其他公司竞争,必须这样做,这些公司正日益增加UI的复杂性和功能。 但是仍然需要更简单,更重要的是,更便宜的解决方案,这些解决方案可以使用经典模板引擎在RoR上进行编写。 因此,它们仍在运行中并且将长期使用。

我看到您可以使用多种语言进行编程,至少可以使用Ruby,Python,Java,Kotlin和C。 您能为初学者提供有关如何学习多种语言的建议吗? 如何成为一名优秀的程序员?

我认为,当语言适合程序员面对的那些任务时,培训的效果将很高。 Ruby非常适合编写Web应用程序,因为与Java相比,在其中使用字符串非常容易。 Python更适合机器学习(它在这一领域拥有丰富的基础架构)。 如果您想学习Python,我建议您解决机器学习任务,而不是编写Web应用程序。 如果您对Java,Kotlin或其他基于JVM的语言更感兴趣,建议您编写分布式系统。 Ruby当前不太适合要求苛刻的并行计算。 为了解决Ruby中的此类问题,我们需要许多消耗大量资源的进程,因此它们将无效。 因此,针对相关问题使用适当的工具将有助于理解为什么以此方式设计该工具。 这将有助于更好地了解其本质。

您的个人“评价”最高的书是什么?

第一个是显微镜下的红宝石。 它写得很简单,描述了解释器的细节。 深入了解口译员的工作方式将有助于解决复杂的问题,还将增强对工具所有权的信心,即 舌头。 我也向初学者推荐这本书。

第二个是“可读代码”。 奇怪的是,它是关于如何编写清晰的代码的:)。 我们编写了大量代码,阅读了大量代码,并且我们必须能够编写其他人可以理解的代码。 为此,我们需要从其他人的角度来看代码。 这样的书很有帮助。 我也向初学者推荐它。 好吧,第三本书...这是一本日语的书,内容涉及处理器的配置方式,体系结构以及所组成的晶体管。 即使以更高的级别解决问题,了解计算机在如此低的级别下的工作方式有时也非常有用。 我建议阅读任何有关微处理器设计的好书,即使乍一看似乎并不明显。

您对俄罗斯和RubyRussia会议有什么期望

我以前从未去过俄罗斯。 我希望我会看到很多美丽的事物,例如美丽的房屋,美丽的风景……此外,在俄罗斯,它应该比在日本冷。 我将很高兴看到并感受到我们两国之间的所有这些差异。

好酷! 我可以向您保证,即使天气很冷(实际上,在9月底,天气对我们来说还不太冷),但是无论如何,会议和晚会都会很热!

我们也在会议上等你! 您可以在9月28日亲自(在传奇的聚会后:)提出问题。 程序在这里 ,现在的票价是9000卢布。

感谢支持RubyRussia的公司:

主办单位-Evrone
一般合伙人-Toptal
金牌合作伙伴-Gett
银牌合作伙伴-JetBrainsBookmate
铜牌合作伙伴-InSales

Source: https://habr.com/ru/post/zh-CN466305/


All Articles