V8常见去优化原因一览

简介:

原作者:江凌

V8 bailout reasons

v8 bailout reasons 的例子, 解释和建议. 帮助alinode的用户根据 CPU-Profiler 的提示进行优化。

索引

Bailout reasons

Bailout reasons

Assignment to parameter in arguments object

  • 简单例子
// sloppy mode only
function test(a) {
  if (arguments.length < 2) {
    a = 0;
  }
}
  • Why

    • 只会在函数中重新赋值参数发生。
  • Advices

    • 你不能给变量 a 重新赋值.
    • 最好使用 strict mode .
    • V8 最新的 TurboFan 会有优化 #1.

Bad value context for arguments value

  • 简单例子
// strict & sloppy modes
function test1() {
  arguments[0] = 0;
}

// strict & sloppy modes
function test2() {
  arguments.length = 0;
}

// strict & sloppy modes
function test3() {
  return arguments;
}

// strict & sloppy modes
function test4() {
  var args = [].slice.call(arguments);
}

// strict & sloppy modes
function test5() {
  var a = arguments;
  return function() {
    return a;
  };
}

ForInStatement with non-local each variable

  • 简单例子
// strict & sloppy modes
function test1() {
  var obj = {};
  for(key in obj);
}

// strict & sloppy modes
function key() {
  return 'a';
}
function test2() {
  var obj = {};
  for(key() in obj);
}

Object literal with complex property

  • 简单例子
// strict & sloppy modes
function test() {
  return {
    __proto__: 3
  };
}
  • Why
  • Advices

    • 简化 Object。

ForInStatement is not fast case

  • 简单例子
for (var prop in obj) {
  /* lots of code */
}
  • Why

    • for 循环中包含太多的代码。
  • Advices

    • for 循环中的提取代码提取为函数。

Reference to a variable which requires dynamic lookup

  • 简单例子
// sloppy mode only
function test() {
  with ({x:1}) {
    return x;
  }
}
  • Why

    • 编译时编译定位失败,Crankshaft需要重新动态查找。#3
  • Advices

    • TurboFan可以优化。

TryCatchStatement

  • 简单例子
// strict & sloppy modes OR // sloppy mode only
function func() {
  return 3;
  try {} catch(e) {}
}
  • Why

    • try/catch 使得控制流不稳定,很难在运行时优化。
  • Advices

    • 不要在负载重的函数中使用try/catch.
    • 可以重构为 try { func() } catch

TryFinallyStatement

  • 简单例子
// strict & sloppy modes OR // sloppy mode only
function func() {
  return 3;
  try {} finally {}
}

Unsupported phi use of arguments

  • 简单例子
// strict & sloppy modes
function test1() {
  var _arguments = arguments;
  if (0 === 0) { // anything evaluating to true, except a number or `true`
    _arguments = [0]; // Unsupported phi use of arguments
  }
}

// strict & sloppy modes
function test2() {
  var _arguments = arguments;
  for (var i = 0; i < 1; i++) {
    _arguments = [0]; // Unsupported phi use of arguments
  }
}

// strict & sloppy modes
function test3() {
  var _arguments = arguments;
  var again = true;
  while (again) {
    _arguments = [0]; // Unsupported phi use of arguments
    again = false;
  }
}
  • Why

    • Crankshaft 无法知道 _arguments是 object 或 array.
    • 深入了解
  • Advices

    • 最好操作 arguments 的拷贝.
    • TurboFan 可以优化 #1.

Yield

  • 简单例子
// strict & sloppy modes
function* test() {
  yield 0;
}

Resources

目录
相关文章
|
8月前
|
前端开发 JavaScript Android开发
打算一个卡片记忆软件,全平台架构如何选型?
打算一个卡片记忆软件,全平台架构如何选型?
|
8月前
|
设计模式 前端开发 Java
KnowStreaming系列教程第二篇——项目整体架构分析
KnowStreaming系列教程第二篇——项目整体架构分析
99 0
|
存储 缓存 监控
一文读懂分布式架构知识体系(内含超全核心知识大图)
7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,更有《阿里云技术面试红宝书》助你拿下Offer!马上投递简历:https://developer.aliyun.com/special/offerday01
17285 0
|
5月前
|
自然语言处理 前端开发 JavaScript
前端进阶必读:JS闭包深度解析,掌握这一特性,你的代码将焕然一新!
【8月更文挑战第23天】闭包是JavaScript的一项高级功能,让函数能够访问和操作外部函数作用域中的变量。本文深入解析闭包概念、组成及应用场景。闭包由函数及其词法环境构成,通过在一个函数内定义另一个函数来创建。它有助于封装私有变量、维持状态和动态生成函数。然而,不当使用闭包可能导致内存泄漏或性能问题。掌握闭包对于实现模块化代码和成为优秀前端开发者至关重要。
49 0
|
8月前
|
监控 前端开发 关系型数据库
常见性能工具一览
今天写了一个调试工具的文章,就有人说起工具到底要会哪些。既然提到这儿了,那就多写几句吧。
205 2
常见性能工具一览
|
8月前
|
运维 Java 开发工具
Java后端学习路线6大维度详细总结(编程基础+开发工具+应用框架+运维知识+成神之路+平稳降落)【可作为知识点梳理列表】【点击可查看高清原图】
Java后端学习路线6大维度详细总结(编程基础+开发工具+应用框架+运维知识+成神之路+平稳降落)【可作为知识点梳理列表】【点击可查看高清原图】
115 0
|
8月前
|
自然语言处理 监控 搜索推荐
佛萨奇2.0/3.0Metaforce原力元宇宙系统开发步骤逻辑丨方案项目丨案例设计丨成熟技术丨源码功能
佛萨奇(VoZaChi)是一个虚拟助手系统,其发展至2.0和3.0版本会有一些特定需求和逻辑
|
开发框架 Java Spring
高光时刻!美团推出Spring源码进阶宝典:脑图+视频+文档
Spring是一个开源框架,相信很多做Java开发的技术人员对Spring并不陌生,Spring是现在企业中经常会用到的,是为了解决企业应用程序开发复杂性而创建的。Spring主要的优势就是可以分层架构,可以为你提供选择使用哪一个组件,同时也会为J2EE应用程序开发体提供集成的框架!
79 0
|
监控 JavaScript API
移动端项目实践方法提炼知识总结
移动端项目实践方法提炼知识总结
移动端项目实践方法提炼知识总结
|
区块链
阐述佛萨奇开发源码 佛萨奇系统开发原力方案 佛萨奇2.0版本源码部署技术解决逻辑
阐述佛萨奇开发源码 佛萨奇系统开发原力方案 佛萨奇2.0版本源码部署技术解决逻辑
114 0