专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

支付宝App瘦身新思路重复指令合并技术

  前言
  稳定性、性能、包大小,是保障移动端用户体验的三驾马车,是app承载业务获得稳定、高效、低成本、增长的重要基石。其中包大小对下载转化率、降低拉新拉活成本等方面的影响至关重要,这在业界已经成为共识,近年来头部app针对下沉市场的极小包策略,更是将包大小的价值提升到了极致。但在实际开发过程中,随着功能的不断迭代,App体积越来越大不进行管控的话会直接影响安装转化率,因此App包大小需要持续的管控和优化。现状
  目前支付宝已经有不少关于安装包瘦身的方案,如:代码治理、资源治理、业务治理、构建优化,经过几轮治理之后现有手段让App瘦身效果越来越不明显,因此需要一种新的手段来进行App进行瘦身来突破的目前的瓶颈。新方案
  新的App瘦身方案是从App的可执行文件开展的,在二进制指令层面进行优化,通过合并大量的重复指令来实现二进制文件体积的减小,从而实现对安装包的瘦身。
  iOS重复指令合并优化成果:
  架构:arm64
  本次共优化了的bundle占比是62,优化后iOS二进制文件减少16。6MB。全量优化后预计能够减少20MB以上。瘦身原理
  下图中最左侧是源代码,中间部分是源代码对应的汇编代码,最右边是源代码进行重复指令合并后的汇编代码。
  从上图中的操作是将重复的指令片段提取到公共的区域中,原来的重复指令段被替换为跳转指令,实现总指令数目变少。不难看出优化后的指令中长度变短了,这也就意味着指令所占用的空间减少,从而实现了二进制文件的瘦身。技术架构图
  本方案架构分为两部分,编译构建和环境适配。编译构建部分主要是解决重复指令合并的编译问题,用来产出经过重复指令合并的App安装包;环境适配主要是重复指令合并的配套设施建设,如crash堆栈的还原、调试信息的还原、产物一致性的校验。
  工程包构建工具链:主要负责根据基线从git仓库中拉取工程代码,并使用APKit构建编译环境;环境准备好后Xcodebuild会根据工程中的配置文件生成编译命令,具体的编译命令由AppleClang来执行并生成IR文件(用于编译优化)以及。frameowork文件(用于正常包);完成编译后LinkLibChecker会根据工程配置提取工程依赖的二进制lib文件;最后将framework和IR和依赖的二进制lib上报到OSS和基线中。
  编译优化安装包构建工具链:RIMKit根据基线下载需要优化bundle的IR文件、不参与优化的framework文件、依赖的二进制lib文件;AlipayRIMOpt工具会将对个IR文件进行合并优化产出libportalOpt。a文件;APKit工具负责构建安装包的编译环境;RIMLinkFlagsUtil工具负责调整portal工程的链接参数,将参与优化的bundle从中链接参数中剔除,把libisaopt。a和依赖的二进制lib添加到链接参数中;最后由Xcodebuild会根据portal工程的配置打安装包。
  环境适配的工具链:一致性校验主要负责检查优化后的安装包中资源文件、符号等信息是不是比正常包的有缺失;crash堆栈还原主要是负责在优化时给新添加的符号及其指令增加调试信息,方便后续的符号定位。反解堆栈时将新增的符号导致堆栈的变换还原为正常未优化时的堆栈状态;debug堆栈还原主要是解决编译优化包线下调试的问题。难点突破重复指令的识别
  要想合并重复指令第一步必须先找出重复的指令,但对于支付宝这种量级的App而言其指令的数量在亿级,在这个数量级下想要快速找出重复的指令并不是一件容易的事情。必须采取合适的策略才能高效解决该问题,接下来为大家介绍求解的具体策略。
  重复指令的定义:两条机器指令的汇编指令、寄存器、立即数所组成的数据须完全一致才认为是重复的指令。
  明确重复指令的定义后,对指令进行编号,结果如下图所示:
  按照上图所示的编排方式,可以把每一行的指令看成字母,这些指令对应的编号就组成了两个字符串:
  funcA:ABCDEFGHIKMNOPQR(表示终结符)
  funcB:ABCDEFGHJLMNOPQR(表示终结符)
  寻找重复指令需求就变成了寻找该字符串中的公共子串。这里考虑使用后缀树来解决公共子串问题,后缀树是一种能够快速处理各类字符串问题的数据结构,非常适合应用在这个场景中。
  下图将字符串
  ABCDEFGHIKMNOPQRABCDEFGHJLMNOPQR构建成为后缀树的形式。接下来介绍如何通过后缀树找到重复的字符串。
  针对上图中的后缀树做一个简单的介绍,0号表示根节点,方形框表示叶子节点,圆性框表示中间节点。以三号节点为例:3号节点是21号和22号节点的父节点,这表示ABCDEFGH是字符串
  ABCDEFGHIKMNOPQRABCDEFGHJLMNOPQR和
  ABCDEFGHJLMNOPQR的公共子串。所以子节点数量表示了父节点字符串出现重复的次数。因此在提取公共字符串的时候可以忽略所有的叶子节点(方形),因为他们的子串数目为零表示没有出现重复的情况。
  分析后缀树的非叶子节点发现4、5、6、7、8、9、10号节点代表的字符串为3号节点代表的字符串的子串;16、17、18、19、20号节点为15号节点的子串。因此只需要将3号15号节点填入下面的表格中。
  可合并字符串计算表格:
  原始字符串
  ABCDEFGHIKMNOPQRABCDEFGHJLMNOPQR
  节点编号
  3hr15hr公共字符串
  ABCDEFGH
  MNOPQR
  子节点数S
  2hr2hr正因为采取了后缀树算法,让发现重复指令的效率从朴素算法的O(n3)降低为O(n)。目前优化支付宝300的bundle的重复指令查找耗时控制在13分钟左右,让重复指令合并能够顺利迈出第一步。剔除不能合并的指令
  并不是所有指令都能进行合并的比如:跟LR寄存器有关的操作。这些相关的指令合并后会导致程序进入死循环。所以这里面临的第二个难点是把不能合并的指令找出并剔除。
  上图中funcA和funcB函数的开头和结尾的两条指令是用来做压栈和出栈操作的都是跟LR和FP寄存器相关的,所以这几条指令是不进行合并的。在求解重复字符串的时候要进行剔除操作如下图所示。
  了解了不可合并字符串的剔除规则后,接下来介绍如何根据后缀树找出的重复字符串求解出待合并的字符串集合。根据不可合并字符串的剔除规则可以将3号节点和6号节点的字符串分割为下表待合并字符串这一行的形式。
  可合并字符串计算表格:
  节点编号
  3hr15hr公共字符串
  ABCDEFGH
  MNOPQR
  子节点数S
  2hr2hr包含的无法合并字符串
  C
  M
  O
  待合并字符串
  AB
  DEFGH
  N
  PQR
  通过上述策略可以有效的剔除不能参与合并的指令避免程序出现异常,同时又可以将重复指令尽可能多得进行合并,如果将存在不能合并的指令序列完全放弃掉合并效果会大幅缩水。部分指令不能合并的原因分析
  关于LR寄存器:程序跳转(BL指令)时,会将BL指令后面的指令地址写入LR寄存器中,当程序执行完成后便会回到LR寄存器指向的地址。
  场景一:压栈和出栈
  上图中假设发生重复的指令片段在压栈和出栈这两段指令上。当程序执行完1号红色箭头时LR寄存器中原有的数据从指向main函数中的某个指令地址被替换为指向E行指令的地址。接下来要执行到2号红色箭头时需要构造funcA的栈帧,但LR寄存器中的地址不再指向原本要返回的main方法中,而是指向了funcA中的E行指令的地址这就导致程序再也无法返回到main函数中继续执行,所以这种合并会导致程序出错。
  上图中1号黄色箭头执行完后并不会改变LR寄存器也不需要返回。当2号黄色箭头执行完时,LR寄存器里的数据是指向要返回的main方法中的某条指令,执行ret后即可正常返回,但是带来的副作用是堆栈显示存在异常。异常结果如下图所示:
  merge1执行完成后应该出栈,但结果确实funcA出了栈。所以这种情况也不能进行重复指令的合并操作。(如果1号黄色箭头指向的不是b指令跳转而是BL指令跳转,则同样会导致程序返回异常)。场景二:分支指令
  上图中假设发生重复的指令片段在函数调用这段指令上,存在调用关系mainfuncA。当程序执行完1号红色箭头时LR寄存器存储了E指令的地址。接下来要执行完2号红色箭头时LR寄存器存储了D指令的地址。但是由于在merge0函数中没有构造栈帧所以LR中原来指向E指令的数据被覆盖掉了,永远指向了D行的指令导致merge0无法返回到funcA中,程序也就无法正常执行。因此涉及到BL分支指令也不能进行合并。重复指令的合并
  找到待合并字符串后,并不意味着都可以进行合并,因为有些字符串合并后反而会变的更长。所以需要预先估计每个待合并字符串的收益,收益大于0才会进行合并。接下来推导一下重复字符串合并所节省的字符数量公式:
  L:公共字符串长度(重复指令数量);
  S:子节点个数量(重复次数);
  R:节省的字符数量(节省出的指令数量)。
  节省字符数量的公式:
  添加指令为BL时:RL(S1)(S11)
  添加指令为B时:RL(S1)(S1)(被合并的指令是以ret结尾的时候使用B指令跳转)
  L(S1)表示:S个长度为L的字符串的长度之和公共方法中字符的个数。
  (S11)表示:S个重复字符串乘以新增加的字符数(bl指令)合并后的公共方法中新增加的一个L字符(ret指令),如果是B指令则不增加L字符(ret指令)。
  接下来继续完善重复指令算表格。
  可合并字符串计算表格:
  原始字符串
  ABCDEFGHIKMNOPQRABCDEFGHJLMNOPQR
  节点编号
  3hr15hr公共字符串
  ABCDEFGH
  MNOPQR
  子节点数S
  2hr2hr无法合并字符串
  C
  M
  O
  待合并字符串
  AB
  DEFGH
  N
  PQR
  待合并字符串长度L
  2hr5hr1hr3hr预计节省字符数R
  1
  2hr2
  1hr可合并字符串
  无
  DEFGH
  无
  PQR
  可合并字符串位置坐标
  无〔4,8〕
  〔21,25〕
  无〔14,16〕
  〔31,33〕
  利用上文中提到的预计节省字符数的计算公式算出每个节点预计节省的字符数,接下来将预计节省字符数小于1的节点删除,因此可合并字符串只剩下EFGH和PQR。
  确定待合并字符串后,可以开始进行重复指令的合并操作,具体步骤如下图所示:
  第一步:根据待合并字符串找出其对应的指令,并在程序原有的指令中插入一个新的函数ALIPAYREPEATFUNCTION1。并将字符串的所对应的指令填入该函数中,然后再向指令结尾添加ret指令。
  第二步:根据待合并字符串中的位置坐标,找到在原程序中的位置。
  第三步:并将该位置原有的指令替换为blALIPAYREPEATFUNCTION1指令(如果被合并的指令是以ret结尾,则可以使用B指令进行跳转),从而实现对重复指令的替换,至此便实现了重复指令的合并优化。适配新的编译流程
  为了能够发现并且尽可能多的合并重复指令,需要改造当前的编译工具链流程。将多个传统单个编译单元中的指令合并到一个更大的编译单元中,具体流程如下所示。
  非重复指令合并的编译流程:
  非编译优化的编译流程是将一个文件作为一个编译单元进行编译,产生。o文件后由链接器链接为lib库文件,lib文件最后被链接器链接到可执行程序中完成可执行程序的编译流程。如果按照这个流程进行重复指令合并优化,那么只能将这个一个文件中重复的指令进行合并,能够合并的指令数量有限优化后效果不佳。为了能够将更多的重复指令合并,需要对传统的编译流程做出调整。
  适配重复指令合并的编译流程:
  适配编译优化后的流程是将单个文件编译为IR中间文件,由llvmlink将其链接为一个IR文件,之后进行常规优化。接着进行重复指令的合并,由于之前将多个编译单元合并为一个编译单元,在做重复指令合并的时候就可以将多个文件里的重复指令进行合并,实现最大化的优化效果。重复指令优化产生。o文件。最后obj文件被链接器链接到二进制可执行文件中,至此编译流程结束。
  将编译流程配合重复指令优化进行调整后相比较于调整前App体积减少了接近8倍。对App性能的影响
  指令合并优化目前只是新增了BL和B指令,并没有真正的去构建函数栈帧,所以不会增加内存的额外开销。通过对启动性能的分析评估,影响在约为0。8ms左右。
  作者:松茸
  来源:微信公众号:蚂蚁质量AnTest
  出处:https:mp。weixin。qq。comswhGWVm4CfcHjamiVuxSUw

好养易爆花的溲疏,新手也能轻松养成花瀑布,耐寒25度冻不死溲疏养护简单,开花量大,春季盛开时花朵如瀑布般倾斜而下,非常的壮观,在北京的公园里也常常可见大花溲疏的身影,这几年原因品种的溲疏逐渐火爆起来,例如冰生雪球雪樱花等。溲疏简介与生长习三代人的石榴缘,是有颜色有味道的乡愁三代人的石榴缘文孙景璞秋高气爽,瓜果飘香。楼下花坛中的石榴树上,挂满了红彤彤的石榴,风一吹动,晃晃悠悠,摇摇欲坠。此情此景,勾起了我对我家三代人栽种石榴树的往事的回忆。姥姥家的石榴品出秋天的味道时令水果好柿到来央视网消息目前正是柿子成熟的季节。柿子的维生素含量丰富,再加上其具有润肺的功效,被认为是很适宜秋天食用的水果之一。除了寻常的吃法,您吃过烤柿子和脆柿子吗?一起跟随记者去尝尝。圆润饱秦朝法律竟然和身高有关矮个子免罪离婚退嫁妆(前言直到今天,百味给老友的作品下面留言,有很多老友依然看不到,无法跟老友们互相沟通。如果老友们看到此篇文章,就当百味向您的一声衷心问候吧!)朋友们都知道,秦国是一个以法治国的朝代陈汤卫霍之后大汉最耀眼的军事奇才,两起两落后悲惨离世头条创作挑战赛江山代有才人出,英豪留名垂青史。提起西汉的军事将领,首先想到的就是卫青和霍去病这对舅甥,他们都是骁勇善战,封狼居胥的大才。然而西域边境安危,需要代代人的守护,在他们之鹏子的潇洒半生寄语你我生如蝼蚁,当有鸿鹄之志,虽然命如纸薄,应有不屈之心。大丈夫生居天地间,岂能郁郁久居人下,当以梦为马,不负韶华,乾坤未定,你我皆是黑马。老家的村子有三千人左右的常住人口,在上我们,到此为止吧有没有花店,你都要独自绽放来源再见某人IDzjmouren早些年,我相信爱情应该有轰轰烈烈,应该有生离死别而后多年也会明白,当初那句稚气的甘愿为你付出一切,其实并不意味着永远都会,在郊外山上,被两块石头碰到了,问题应该不大!哈哈哈这样的煎饼就问你吃过没有呢有了个这瞬间感觉就上来了啊仿佛心灵受到了洗礼来兄弟击个掌遇到这样的情况应该说点什么才能缓解尴尬鳄鱼的脸都被你们丢光了啊这下生意不就来了吗这新郎官一看就是有墨西哥为何向美国军火商讨说法?近期,墨西哥打定主意,要向美国军火商讨说法。上月底,美国马萨诸塞州一名联邦法官驳回了墨西哥去年针对美国军火商提起的诉讼。在该起诉讼中,墨西哥方面控告11家美国军火商因渎职和非法商业越是不顺,越要沉住气人生的路,向来坑坑洼洼。一路走来,就如同唐僧过九九八十一难一般,不断地升级打怪,每遇到一个难关,我们总会有种错觉,眼前就是最大的磨难和挑战了。然而,如果我们再往前多走几步,我们就会和你在一起是我最美好的回忆江水有一个无人的小生伏在铜像下祈祷的人也来了惊醒的人们都是这样的美丑环绕着淙淙的泉水颤动了黑水中漏进来的泥土伏在铜像下祈祷的人也来了水流的海水堆成了一座浅草碧落的太阳收敛了你的心化
没有什么大不了的,再来吧人生中最低谷时安慰自己的一句话是什么每当感觉自己的人生很差劲时,最重要的就是心态要稳定下来,告诉自己没什么大不了的,然后积极找原因,寻求突破,是运气,是努力,或者有其他的原因。告诉夜读我,想你没睡头号解忧馆你知道吗?我,想你没睡我想,你没睡我想你,没睡你依旧是我每天,睡前和睡醒时第一个想到的那个,撕心裂肺那个人只是余生很遗憾没有走的那么长久,或许是我们的缘分已尽了图网我再也颜值更高,性能更强追风者G500A机箱实测体验Hello,大家好!我是沈少!说到千元内的中高端机箱,追风者的经典款P500A一直是经常被提起的一款。出色的做工用料,够大够能装的体积,加上自带RGB风扇和TypeC前置接口这些优小米顶部的两个大孔大家能看出来是什么吗?最近几天看了好多大V爆料小米13系列的图片,我就随手在他们文章下面评论自己的一些需求,反正评论回复的各种声音都有。所以想问问,大家真的没人在意这些吗?又或者真的觉得一个机器摄像提升外卖行业的下滑,或许是平台从放弃算法的那一刻起!在我个人看来,外卖餐饮行业的逐渐衰败就是两家公司放弃算法追逐,延长送餐时间的那一刻起。先声明,我理解外卖小哥送餐的辛苦,也知道他们为了谋求生计,整日在送餐路上疲于奔命不惜违反交通规A股传来大利好下周一有望引领反弹的四大板块及龙头个股的逻辑我的观点最近这波行情,可以比较明显的看出,真正有持续性的,都体现在以外资,内资大机构重仓的白马上。白酒和医药。这个很容易受港股的带动加之年底这个节点,其一为了排名,其二是超级机构大我的桌面1。0计划在减法中前进我一直认为需求的满足是物质多少的标准,只要够用就可以,没有必要花里胡哨。对于目前我的桌面组合,可以用简单来形容,这也是做这套桌面的意义,不想要杂乱的桌面,尽量保持相对的整洁,不需要苹果已测试补丁,部分M1M2Mac设备出现WiFi连接问题IT之家12月13日消息,援引国外科技媒体9to5Mac报道,部分M1M2芯片的MacBooks用户反馈出现WiFi网络连接问题。主要表现为互联网连接速度慢,导致视频通话出现卡顿等腾讯立式刷掌设备专利获授权12月13日,天眼查App显示,腾讯科技(深圳)有限公司立式刷掌设备专利获授权。专利摘要显示,本专利属于电子设备技术领域,该立式刷掌设备包括底座立柱刷掌模组人体探测传感器和动态交互电脑键盘你不知道的秘密1。很多时候,需要暂时离开座位去做别的事情,如果对自己的电脑安全很重视,不妨按住windows键后,再按L键,这样电脑就直接锁屏了,这样就不用担心电脑的资料外泄啦2。要找电脑上的文你知道,冬天最适合喝黑茶吗?许多茶友们都知道,茶有绿茶白茶黄茶红茶乌龙茶黑茶等品种。那你知道,冬天最适合喝什么茶吗?其实冬天最适宜喝的是黑茶。因为冬天喝黑茶,有很多好处。好处1暖胃御寒冬天是一年当中最寒冷的季
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网