字节码预编译
现代主流的 JavaScript 引擎在执行一段js代码的大概流程是:先读取源码文件,解析源代码并转换成字节码 (bytecode),最后执行。在运行时解析源码转换字节码是一种时间浪费,所以 Hermes 选择预编译的方式在编译期间生成字节码。这样做一方面避免了不必要的转换时间,另一方面多出的时间可以用来优化字节码,从而提高执行效率。
放弃 JIT
为了加快执行效率,现在主流的 JavaScript 引擎都会使用一个 JIT 编译器在运行时通过转换成机器码的方式优化 JS 代码。Faceback 团队认为 JIT 编译器有主要俩个问题:
(1) 要在启动时候预热,对启动时间有影响;
(2) 会增加引擎 size 大小和运行时内存消耗。
基于这俩点对性能指标的影响,Faceback 团队决定不实现JIT编译器。这里所谓放弃 JIT,有两点需要再解释一下:
(1) 纯文本 JS 代码执行效率降低。放弃JIT,是指放弃运行时 Hermes 引擎对纯文本 JS 代码的编译优化。
(2) 对 RN 代码的动态性无影响。由于 Hermes 仍然可以执行纯文本的 JS 代码,并且可以支持动态读取bytecode,因此对 RN 的动态性并无影响。
Hermes 缺点:
bytecode 文件占用size过大问题:Hermes 编译的字节码文件比纯文本js文件增大 100%
执行纯文本 js 耗时长:在客户端将纯文本 js 转换成 bytecode 之前,我们让 Hermes 加载纯文本
- 缓存问题:使用缓存的 Hermes 引擎加载业务代码表现非常一般,甚至某些情况下比第一次加载还要慢
[](
)改造过程
官方教程:
[https://reactnative.dev/docs/hermes](
)
官方教程非常简单,但是是纯 React Native 工程的改造流程,而没有混合工程的改造流程 (且纯 React Native 工程也一堆坑)
由于 WubaRNSDK 是混合工程,所以以下改造流程为自行摸索:
react-native init projectName --version 0.64.0-rc.2
npm install
在 node_modules 中获取 hermes 引擎的 aar:
aar 后缀改为 .zip,解压出 so 库,在 WubaRNSDK 中替换掉旧有的 libjsc.so、libc++_shared.so:
修改 ReactInstanceManager 的 JavaScriptExecutorFactory 为 HermesExecutorFactory:
ReactInstanceManagerBuilder builder = ReactInstanceManager.builder()
.setApplication((Application) context.getApplicationContext())
.addPackage(new MainReactPackage())
.setRedBoxHandler(mExceptionHandler)
.setUseDeveloperSupport(RNDebugSwitcher.getInstance().isDebug())
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE)
.setJavaScriptExecutorFactory(new HermesExecutorFactory());
如果运行时出现,则是转换 Bundle 时字节码版本不对:
HermesVM: Compiling JS failed: Wrong bytecode version. Expected 76 but got 59
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ WubaRN$ExceptionHandler.handleException (WubaRN.java:526)
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ : com.facebook.jni.UnknownCppException: Unknown
2021-07-21 17:27:38.881 8792-8851/com.wuba.wbrn E/WubaRN: │ at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
### 计算机网络
* HTTP 缓存
* 你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?
* HTTP 常用的请求方式,区别和用途?
* HTTPS 是什么?具体流程
* 三次握手和四次挥手
* 你对 TCP 滑动窗口有了解嘛?
* WebSocket与Ajax的区别
* 了解 WebSocket 嘛?
* HTTP 如何实现长连接?在什么时候会超时?
* TCP 如何保证有效传输及拥塞控制原理。
* TCP 协议怎么保证可靠的,UDP 为什么不可靠?
![](https://s2.51cto.com/images/20210920/1632129668658785.jpg)
**[CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://ali1024.coding.net/public/P7/Web/git)**
### 算法
* 链表
* 字符串
* 数组问题
* 二叉树
* 排序算法
* 二分查找
* 动态规划
* BFS
* 栈
* DFS
* 回溯算法
![](https://s2.51cto.com/images/20210920/1632129668115812.jpg)
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/165782.html