v8-natives
访问 v8 原生指令的简单 API
npm i --save v8-natives

v8-Natives

npm npm npm Twitter Follow

更新

最近测试于 Node 14 & Chrome 80+

在 Chrome & Node 中轻松访问 v8 引擎的本地指令

我在阅读一篇博客/维基文章 https://github.com/petkaantonov/bluebird/wiki/Optimization-killers 时,发现了一些我完全不知道的低级诊断命令;因此,我认为它们对于我所做的事情非常有用。V8 引擎有一系列可以调用的命令,可以获取和/或在实际的 V8 引擎中设置状态。这个库是我尝试使我的生活更加轻松并消除使用 V8 原生命令时错误的尝试。这些低级命令允许你访问告诉 V8 引擎优化例程,并找出例程是否可以/正在被优化。

现在,你可以直接调用 v8 原生命令(例如 %CollectGarbage());但是,如果你忘记使用 --allow-natives-syntax,那么 V8 引擎将立即停止解析文件,因为所有 V8 命令都以 '%' 开头,这是无效的 JavaScript... 这个库所做的是,它是一个简单的包装器,它包装了这些调用;因此,我可以这样做(v8.CollectGarbage())。如果你忘记了 --allow-natives-syntax,它仍然可以正常运行你的代码;只是什么也不做。

在示例文件夹中有一个浏览器示例;为了展示它在 Chrome/Chromium 中的工作方式(chrome --js-flags="--allow-natives-syntax" browser.html)。你可以在非 V8 浏览器中运行它,它将只使用模拟的包装器。
此外,还有一个 NodeJS 示例,展示了在 NodeJS 中相同的支持。(node --allow-natives-syntax node.js

请注意,示例和辅助命令可以向您展示如何使用库中的大量优化、通用和内存调用。如果有人想使用变量/对象信息命令编写一些示例,他们将会非常欢迎!

安装 V8 Natives

npm install v8-natives

破坏性更改

已从 V8 的最新版本中删除

  • setFlags
  • getV8Version

在 v8 中重命名

  • functionGetName = getFunctionName

用法

浏览器

<script src="v8-browser.js" onload="waitForV8(some_callback)"></script>
<script>function some_callback() {
v8.collectGarbage();
/* more v8.commands */}
</script>

Node

var v8 = require('v8-natives');   
v8.collectGarbage();
/* more v8 commands */

命令

辅助命令

  • helpers.testOptimization(func[, funcNames]) - 这将自动调用函数一次,调用 optimizeOnNextCall;再次调用函数,然后调用 printStatus。您还可以这样做:testOptimization([func1, func2, func3]) 这是为了如果您有 func1,它调用了 func2 & func3,您可以看到这三个是否都被优化。它将自动调用 func1,将优化标志设置在所有三个函数上,然后调用 func1,然后打印所有三个函数的状态。
  • helpers.printStatus(func) - 将函数优化结果打印到控制台
  • helpers.benchmark(count, func) - 在循环中运行 func count 次。这将自动设置优化标志;运行 count 次;运行垃圾收集开始计时;运行 func count 次;然后返回所花费的总时间。
  • waitForV8(callback) - [仅在浏览器中使用]; 此函数将等待 v8 命名空间正确加载,然后调用您的回调。

通用命令

  • isNative() - 是否启用本地支持模式(即 true = 使用真实包装器;false = 使用虚拟包装器)
  • functionGetName(func) - 获取函数的字符串名称

内存命令

  • getHeapUsage() - 显示使用了多少堆内存
  • collectGarbage() - 强制进行完整垃圾回收

优化命令

  • deoptimizeNow -
  • optimizeFunctionOnNextCall(func) - 告诉 v8 在下次调用时优化该函数
  • deoptimizeFunction(func) - 反优化一个函数
  • neverOptimizeFunction(func) - 从不优化一个函数
  • getOptimizationStatus(func) - 获取函数的优化状态 [1 = 优化,2 = 未优化,3 = 总是优化,4 = 从不优化,5 = ?,6 = 可能优化] 我在测试中只看到了 1 & 2;但根据我读到的博客/维基文章,3、4 & 6 也是有效的)

变量/对象信息命令

  • hasFastProperties(obj)
  • hasFastSmiElements(obj)
  • hasFastObjectElements(obj)
  • hasFastDoubleElements(obj)
  • hasDictionaryElements(obj)
  • hasFastHoleyElements(obj)
  • haveSameMap(obj1, obj2)
  • isValidSmi(obj)
  • isSmi(obj)
  • hasFastSmiOrObjectElements(obj)
  • hasSloppyArgumentsElements(obj)

注意

optimizedFunctionOnNextCall(func) 需要在函数运行之前才能为其标记为优化。所以步骤是

  • 运行您的函数
  • 运行您的函数(必须做两次)
  • 为您的函数标记为优化
  • 运行您的函数
  • 验证 v8 引擎是否对其进行了优化。如果没有进行优化;那么这意味着您有无法优化的代码。

变更日志

v8 内部函数列表已更改,以下函数已被移除

  • getOptimizationCount

v8 重命名

  • ClearFunctionTypeFeedback 更改为 ClearFunctionFeedback