铜仁市论坛

首页 » 分类 » 问答 » Java程序员必会的项目代码分层
TUhjnbcbe - 2021/4/22 19:58:00
作者

VictorGomes译者

王强策划

蔡芳芳参数适配器机制不仅复杂,而且成本很高。

本文最初发表于v8.dev(FasterJavaScriptcalls),基于CC3.0协议分享,由InfoQ翻译并发布。

JavaScript允许使用与预期形式参数数量不同的实际参数来调用一个函数,也就是传递的实参可以少于或者多于声明的形参数量。前者称为申请不足(under-application),后者称为申请过度(over-application)。

在申请不足的情况下,剩余形式参数会被分配undefined值。在申请过度的情况下,可以使用rest参数和arguments属性访问剩余实参,或者如果它们是多余的可以直接忽略。如今,许多Web/Node.js框架都使用这个JS特性来接受可选形参,并创建更灵活的API。

直到最近,V8都有一种专门的机制来处理参数大小不匹配的情况:这种机制叫做参数适配器框架。不幸的是,参数适配是有性能成本的,但在现代的前端和中间件框架中这种成本往往是必须的。但事实证明,我们可以通过一个巧妙的技巧来拿掉这个多余的框架,简化V8代码库并消除几乎所有的开销。

我们可以通过一个微型基准测试来计算移除参数适配器框架可以获得的性能收益。

console.time();functionf(x,y,z){}for(leti=0;iN;i++){f(1,2,3,4,5);}console.timeEnd();

移除参数适配器框架的性能收益,通过一个微基准测试来得出。

上图显示,在无JIT模式(Ignition)下运行时,开销消失,并且性能提高了11.2%。使用TurboFan时,我们的速度提高了40%。

这个微基准测试自然是为了最大程度地展现参数适配器框架的影响而设计的。但是,我们也在许多基准测试中看到了显著的改进,例如我们内部的JSTests/Array基准测试(7%)和Octane2(Richards子项为4.6%,EarleyBoyer为6.1%)。

太长不看版:反转参数

这个项目的重点是移除参数适配器框架,这个框架在访问栈中被调用者的参数时为其提供了一个一致的接口。为此,我们需要反转栈中的参数,并在被调用者框架中添加一个包含实际参数计数的新插槽。下图显示了更改前后的典型框架示例。

移除参数适配器框架之前和之后的典型JavaScript栈框架。

加快JavaScript调用

为了讲清楚我们如何加快调用,首先我们来看看V8如何执行一个调用,以及参数适配器框架如何工作。

当我们在JS中调用一个函数调用时,V8内部会发生什么呢?用以下JS脚本为例:

functionadd42(x){returnx+42;}add42(3);

在函数调用期间V8内部的执行流程。

IgnitionV8是一个多层VM。它的第一层称为Ignition,是一个具有累加器寄存器的字节码栈机。V8首先会将代码编译为Ignition字节码。上面的调用被编译为以下内容:

0dLdaUndefined;;Loadundefinedintotheaccumulator26f9Starr2;;StoreitinregisterrLdaGlobal[1];;Loadglobalpointedbyconst1(add42)26faStarr1;;Storeitinregisterr10c03LdaSmi[3];;Loadsmallinteger3intotheaccumulator26f8Starr3;;Storeitinregisterr35ffafCallNoFeedbackr1,r2-r3;;Invokecall

调用的第一个参数通常称为接收器(receiver)。接收器是JSFunction中的this对象,并且每个JS函数调用都必须有一个this。CallNoFeedback的字节码处理器需要使用寄存器列表r2-r3中的参数来调用对象r1。

在深入研究字节码处理器之前,请先注意寄存器在字节码中的编码方式。它们是负的单字节整数:r1编码为fa,r2编码为f9,r3编码为f8。我们可以将任何寄存器ri称为fb-i,实际上正如我们所见,正确的编码是-2-kFixedFrameHeaderSize-i。寄存器列表使用第一个寄存器和列表的大小来编码,因此r2-r3为f。

Ignition中有许多字节码调用处理器。可以在此处查看它们的列表:

TUhjnbcbe - 2021/4/22 19:58:00

“编码和系统设计问题上做得非常好,但是culturefit失败了……我该怎么办?”

来源:blind

一位曾参加过亚麻面试的网友求助道!

Culturefit主要在面试的BQ部分会考察到,而作为考察BQ的先行者Amazon,对BQ更是爱的深沉,BQ答得不理想,culturefit失败,会直接导致面试失败。

大厂都爱考BQ

亚麻对BQ的重视,也传染给了其他公司,大厂纷纷效仿起来:

Google不管是SDE还是UX,都要考BQ;

Apple的DataScienceEngineer岗位要考BQ;

Microsoft专门拿出30分钟考跟公司文化相关和BQ。

由此可见,想要上岸,除了技术能力过硬,软技能也要跟得上。

BQ答的好,甚至可以帮你补足在其他方面的欠缺!

高情商助力拿offer

我们的学员中就有这样一位,不是学霸,学校背景普通,实习经历普通,简历中项目简单、技术栈较旧......但是凭借高情商高智商,在BQ环节有着不俗的表现,最终斩获Amazonoffer!

向上滑动阅览offer故事

同学虽然有两次实习经历,但都是在国内的中小公司,且所参与的项目内容没有太多亮点。与此同时,同学自己的项目也比较简单,没有系统级别的架构搭建,只是纯粹运用一到两种编程语言,来完成小功能模块。

然而,所有的薄弱都无法掩盖该同学一个优点,就是情商/职商较高。在与人的沟通能力上,应对BQ的从容表现上都是可圈可点的。

经过内推后,同学拿到了Amazon的面试。由于学校的CE转CS开发课程负担较重,这位同学并没有将数据结构与算法掌握到驾轻就熟、举一反三的程度。面试在即,临阵磨枪已经来不及。

但是,在与面试官沟通的每一轮之前,同学都将BehaviorQuestion,自我介绍的部分,以及如何与面试官沟通进行反复练习。准备好的自我介绍与项目介绍能把自己最为优秀的一面表现出来。在面试中,面试官多次问到已经准备充分的BehaviorQuestion的问题,包含项目中碰到合作困难的解决方法、个人弱项在项目中的实际表现、团队中leader的能力和责任等。

这位同学虽然在数据结构与算法上未能给出最优答案,但是强大的沟通能力与近乎完美、结合自身经历的BehaviorQuestion作答争得了面试官的青睐,最后顺利斩获AmazonOffer。

这也说明:想要通过亚麻面试,BQ要准备的非常好才行。

然而很多同学都反映:

不像1+1=2这种问题会有标准答案,BQ这种没有标准答案的东西更难搞定。

那么,如何答好BQ?

为了帮助大家备战BQ面试,直通硅谷特邀请FLAG资深面试官做了BQ专场讲座,老师特意举了一些与大学课程project类似的例子,亲自演示如何围绕这两个例子准备跟Amazon相关的BQ,逐条对亚麻14条进行讲解!

以下是部分节选内容~

扫码联系小助手,回复关键词,即可获取完整讲座资源!听面试“大佬”亲自传授亚麻十四条应对秘籍!

不认真准备BQ不可行,只认真准备BQ也不可行!

求职是个很综合的事情!除了BQ,编程能力、怎么介绍项目、沟通时能不能清楚表达自己的想法、需要写coverletter么、是否要内推……都是要考虑的事情!

只着眼于一方面并不能实现求职突破,你需要更全面、更专业的求职帮助。

软件工程师求职提高旗舰课重磅更新,紧跟大厂最新面试趋势,帮你扫除学校与工业界之间的GAP!

软件工程师求职提高旗舰课

重磅更新

点击海报·了解课程

加增1周基础过渡,加量不加价!包含:

orientation

简历及CoverLetter讲解

时间复杂度与空间复杂度

基础数据结构巩固与面试题目练习

easy-medium算法巩固与面试题目练习等课程模块

新增了2周国内海归求职模块,特邀国内大厂面试官直播授课,可以快速帮助回国求职的同学度过海外到国内的求职过渡期。

向上滑动阅览新增课程内容详情

计算机网络Network:增加网络层,传输层,应用层等相关协议及框架,拥塞控制、错误控制的原理及方法等课程模块。

在国内大厂及美国本土部分科技公司包括前端工程师、后端工程师、算法工程师等不同岗位的面试中,同学们经常会被问到计算机网络与系统设计相关的问题。这类知识在近两年面试中,考察比重逐年上升。对于计算机网络知识的掌握有利于求职者深入理解网站开发、全栈开发等信息传输机理,增强实战能力。

JavaJVM(Java虚拟机):增加Java多线程、锁、类加载机制、内存模型等底层原理实现的相关课程模块。

在国内大厂及美国本土部分科技公司面试中,java内存模型、垃圾回收机制、java中的锁以及多线程都是经常被考察到的知识。扎实的java基础知识理解是考察面试者基本功的有效方法,也是斩获offer的前提条件。

操作系统:增加进程与线程、死锁、内存管理等面试中经常出现的核心考点课程模块。

作为开发人员,在工作中经常需要与底层操作系统打交道。加强对操作系统原理的理解对同学们排查问题、提高代码运行效率都有很大帮助。本课程将对进程与线程、死锁、内存管理等面试中经常出现的核心知识点进行解析及练习,帮助同学们融会贯通操作系统层级的工作机理。对于应用级别的开发应用优化也有很大帮助。

设计模式:增加UML、继承、抽象工厂等23种设计模式的讲解及应用举例练习。

无论是国内或国外科技公司,对于面向对象编程思想的考查可谓无处不在。通过OOD的设计模式应用测试,可以快速了解求职者对于软件模块化设计思想的掌握情况。工作或实战项目中,OOD的编程思想则更加重要。

国内外技术岗面试有异曲同工之处,新增的2周国内海归求职模块更是对北美面试的有效补充,尤其对于国内大厂在北美的分公司,部分美国本土科技公司,增设内容是十分重要的考点。

非常适合之前在海外留学,因为疫情留在国内,想要转战国内超一线科技大厂、海外科技公司中国分部的同学。

扫码添加小助手,不仅可以获取免费求职咨询,还能获取一手求职资讯哦~

1
查看完整版本: Java程序员必会的项目代码分层