引入Uber Poet,一个开源模拟应用生成器,用于确定更快的快速构建

0.
引入Uber Poet,一个开源模拟应用生成器,用于确定更快的快速构建

鉴于优步业务的范围和规模,我们的SWIFT应用是世界上最大的应用。每个应用程序都拥有500,000到100万行的运输SWIFT和Objective-C代码,以及测试和自动生成的模型的代码行数约为三倍。

由于我们的iOS应用程序的化妆,Swift编译时代是我们工程师的重要考虑因素。只有几年前,使用我们的Swift的骑手应用程序清洁建设时间,用于花费30到45分钟,并在构建配置的改进之后,Swift编译和构建硬件,Swift Builds现在需要大约5到10分钟应用程序。缓慢的建设时间导致工程师的更长的开发时间,这意味着新功能和改进的周转时间较慢,以及长期建设时间的所有其他典型问题

在Swift 4.0之前,我们决定构建许多小型Swift模块(约300个)整个模块优化(WMO)模式是优步的最快整体构建模式。Swift 4.0引入了一种新的批量构建模式,在大多数情况下广告以更快地工作,速度约为25%,以便使用我们的约300模块配置。

我们想测试是否将代码的应用程序部分重构为几个大模块,将通过新的批处理模式使我们的整体构建时间更快,但实际上没有重构它。要测试这个假设,我们创造了超级诗人模拟应用程序生成器以模拟我们的目标依赖性结构。使其他人能够从我们的模拟应用程序生成器中受益,我们决定开源。

在本文中,我们将讨论这个工具背后的动机、它的设计原则,以及Swift开发人员如何利用该软件开发自己的应用程序。在了解更多关于超级诗人,我们希望您能够激励为自己尝试该工具!

优步诗人如何工作

图1所示。Uber Poet将一个配置对象和一个抽象的依赖关系图编译成一个代码生成的应用程序来表示这些对象。

优步诗人的名字受到启发Android Studio Poet.,这是建立我们解决方案后发现的Android的类似应用程序。与Android Studio Poet一样,Uber Poet为iOS创建模拟应用程序以各种方式测试和基准构建系统。

为完成此操作,优步诗人首先创建由馈入它的命令行选项配置的依赖关系图。依赖关系图的节点描述了模块之间的依赖关系,每个模块的代码行数为多少,模块的名称,以及哪个模块是根应用程序节点。

然后,图形生成器将此图形输入到项目生成器中,然后该项目生成器为每个模块生成代码。然后将代码和项目元数据保存到目标目录中。在优步,我们创造降压构建文件与优步诗人。然后,我们使用Buck来生成Xcode项目文件,可以构建整个模拟应用程序。我们也可以直接使用Buck构建我们的模拟应用程序,并且可以扩展Uber诗人以为其他构建系统生成文件。

为了创建用于测试的新的依赖图,Uber Poet允许我们创建新的图生成器函数。我们还在Uber Poet中创建了一个多套件测试器,用于测试我们所有的图形类型以及多个版本的Xcode和配置选项。我们将转储构建时间跟踪、日志和摘要CSV文件。通过构建跟踪,我们可以了解各种图类型的瓶颈发生在哪里。

优步诗人支持的图形生成类型

优步诗人有助于创建各种类型的图表来描绘模拟应用程序。这些图表表示具有可配置变量的生成函数,例如x,y和z.图表类型包括:

图表类型是x模块,不依赖于任何内容。顶级应用程序模块取决于所有这些模块。分层图表类型是每层具有特定数量的Y模块的x图层。每个模块都依赖于其当前层下层的层中的z模块。顶级应用程序模块取决于此图的顶层。

一种大小单位(bs_flat)图形是一个X个大的“应用”模块和Y个小的“库”模块的集合。这些库模块都不相互依赖。顶层的应用模块依赖于所有大小的库模块。

一种大小分层(bs_layered)图形在一个图中,三个层组相互堆叠在一起。顶层组是应用模块,它依赖于一个大模块的扁平层。大的模块依赖于上面描述的分层图函数生成的图的顶层。

文件图生成器创建一个图表描述的图表DOT文件。BUCK有一个输出模式,它将生成应用程序模块构建图的点文件描述。

我们使用这些点文件来生成带有当前应用程序相同依赖性结构的模拟应用程序。这些模拟应用程序与我们的真实应用的相同应用结构不完全对应,因为点图模拟应用程序中的每个模块都有相同的大小。

使用超级诗人

超级诗人是一个相当简单的命令行应用程序;要运行它,您只需要一台MacOS 10.13或更高的机器,Xcodebuckpipenv.和(可选)clocCLOC.可以通过安装家酿命令:酿造安装CLOC.

然后我们下载项目GitHub.并从终端应用程序运行Python脚本。

例如,我们可以创建一个简单的模拟应用程序genproj.py.,来自Uber Poet GitHub项目

Pipenv运行。/ genproject .py -output_directory .py> $ home/桌面/ mockapp”\
-buck_module_path“/ mockapp”\
-gen_type平\
-lines_of_code 150000

或基于所有图形生成multisuite.py.py.

pipenv运行./multisuite.py -log_dir$ home/桌面/ multisuite_build_results”\
-app_gen_output_dir \

$ home/桌面/ multisuite_build_results / app_gen“

我们建议您指的项目README.md最新的指示。

优步诗人用例

优步诗人主要用作IOS应用程序开发的基准和测试工具。在这个伞下,你可以用它来:

  • 测试新版本并以自动的方式构建Swift编译器的标志,而无需将当前代码库迁移到新版本的SWIFT。
  • 当应用程序的增长而无需自己编写模拟代码,项目构建时间和二进制大小将成为未来。随着多项式编译器算法和策略揭示自己,在某些尺寸点处建立时间的拐点可能会变得明显。
  • 为其他源代码工具生成测试的模拟代码。例如,我们使用它来创建梨贴片的测试夹具
  • 测试如果新的依赖性树架构将导致在未更改应用程序的情况下显着更快或更慢的构建时间。

与优步诗人的基准测试

有了Uber Poet以及我们对整个模块优化、批量构建模式和工具的图形生成器的知识,我们测试了哪个模块架构执行得最快。

为了进行这个实验,我们在一台2015年的四核MacBook Pro上进行了测试。我们测试的每个模拟应用都接近150万行纯Swift代码。生成的应用程序中所有模块的大小都是相同的,除了bs_flat和bs_分层模式,它们的模块比其他较小的模块大20倍。我们平均测试每个构建版本两次。我们对每个构建的结果都非常相似,所以我们决定不运行第三次构建。

以下是我们在测试期间为每个图形类型所使用的独特配置选项:

  • bs_flat:三个大模块,30个小模块,彼此之间没有依赖关系。小模块的代码(LOC)计数:16'667 LOC大:333'340 LOC
  • 平坦的:150个模块,彼此之间没有依赖关系。模块每个设置10'000位置。
  • 分层:150个模块中的10层,只依赖于下层的5个随机模块。模块每个设置10'000位置。
  • bs_layered:就像分层了30个模块,但是在上面又添加了一个层,这是三个大型的“应用程序”大小的模块。小模块的代码(LOC)计数:16'667 LOC大:333'340 LOC
  • 点:〜350等大小模块,具有与优步骑手应用程序完全相同的依赖图。与骑手应用程序不同,模块的大小相同。每个模块约4285个LOC。

绩效结果

下面,我们突出了我们结果的第一行中上述术语的定义:

  • 图表类型:生成了什么类型的图表
  • WMO:如果所有模块都被配置为WMO模块或作为标准(V9)或批量模式(V10)模块。
  • Xcode 9构建持续时间:在Xcode 9中构建此配置需要多长时间为两个构建的平均值。
  • WMO与非WMO时间v9:与Xcode 9中的相反类型相比,构建配置与Xcode 9的相反类型比率。前:WMO构建中的120%意味着WMO构建花费了1.2倍。
  • Xcode 10构建持续时间:在Xcode 10中为Xcode 10构建此配置需要多长时间为两个构建。
  • WMO VS非WMO时间v10:与Xcode 10中的相反类型相比,构建配置与其相反类型相比之下的时间。
  • V10 vs v9时间:构建配置所花费的时间与其他版本相比的比率。例如:73%意味着Xcode 10版本比Xcode 9版本只花费了73%的时间。

在模块架构之间保持线路代码依据,我们发现大小模块结构慢于我们目前在优步使用的许多小模块架构。

我们还发现Swift 4.0显着改善了大小架构的构建时间。与Xcode 9相比,批处理模式也在Xcode 9中以WMO模式迅速构建。在Xcode 9中,标准模式比WMO模式高出约1.4倍。在我们的测试期间,Swift 4.0 WMO构建模式比Swift 3.0 WMO模式更高1.1倍,这是一种性能回归。

在这个实验中,分层图类型比平面图类型更快,因为它选择了一组它下面的层中的五个随机模块来依赖。对于150个模块,这将导致10%到20%的模块由于统计概率而没有连接到主依赖关系图。断开连接的模块永远不会构建,这会导致更快的构建时间。如果您手动将这些断开连接的模块连接到主图上,分层图类型将花费与平面类型相同的时间。

虽然优步诗人没有透露任何更快的方式来重新配置我们的依赖树,以改善构建时间,但它至少保存了我们做出了一项高度努力重构,这将让我们更糟糕的建设时间。

在优步加快建设时间

在优步的实际应用中,如果我们将其打开所有模块,批量模式会增加大约25%的速度减缓了。在一个单独的分析中,我们将模块在WMO模式中单独构建的时间进行了比较,而我们构建中的批处理模式将在WMO模式中进行。当我们这样做时,我们在每个应用程序中找到了大约五个模块的集合,即在我们打开批处理模式时,每次应用程序都会减少总构建时间。

我们最近部署的另一个项目涉及到利用buck将应用程序的各种模块作为二进制库进行预构建。这减少了代码Xcode的数量必须在编辑,构建,运行和测试循环中索引或构建。开发人员可以选择将哪些模块构建为二进制模块以及通过命令行选项保留为源文件的模块。我们估计开发人员将选择图书馆,他们不会经常编辑,冻结第三方库和代码生成的模块,以获取网络模型和测试模型等内容。

向前进

由于我们关于构建典型的应用程序依赖关系图会更快的假设被证明是错误的,所以我们不打算添加更多模拟改进超级诗人此时。但是,我们鼓励您通过以下方式提交自己的模拟改进和其他项目思路拉请求

如果您有兴趣在这样的开源开发人员工具上工作安卓iOS.,考虑加入优步的移动工程团队

评论

没有帖子展示