我如何知道在运行 V8 时编译了什么 JavaScript

How can I tell what javascript has been compiled when running V8

本文关键字:编译 什么 JavaScript V8 何知道 运行      更新时间:2023-09-26

我有一群 V8 编译"热代码"优化 JavaScript 性能。有什么方法可以告诉我哪些代码已经编译,哪些代码没有编译?

首先,您需要在Chrome中Javascript控制台的"配置文件"选项卡中分析代码,以查看值得测试的内容。 如果您尝试测试的函数、模块或任何内容不占用太多时间,则不值得您付出努力。

V8 的 JIT 将对你的代码做出假设,如果这些假设是正确的,代码将是闪电般的快。 如果不是,V8 将随着程序的继续而取消优化该代码。 这是一个例子,来自我自己的测试。 在下面的代码中,我正在测试我编写的合并排序函数。

console.time('order');
msort(ob);
console.timeEnd('order');

60000 个随机数的第一次运行在 8 毫秒后完成,以下所有内容都跳到 16 毫秒左右。 基本上,JIT 对我编写的内容有问题,因此它重新编译了我的代码。 我已经看到完全相反的情况发生,代码跳跃到两倍的速度。 如果你想看一下,这不是确切的版本,而是使用 es6 模块语法的版本。https://github.com/jamesrhaley/es2015-babel-gulp-jasmine/blob/master/src/js/mergeSort/mergeSort.js

此外,如果您的代码不值得优化,那么它就不会一开始就进行优化。 这里有几个链接可以帮助我在编写 js 时提高速度。

https://www.youtube.com/watch?v=UJPdhx5zTaw

https://www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/#so-how-does-javascript-work-in-v8

如果你愿意构建一个独立的 v8 版本,你可以按如下方式运行 shell: d8 --trace-opt foo.js(您可能还想部署--trace-deopt,因为您的代码可能会被取消优化(然后再次重新优化)。

另一个有用的选项是--print-code,它可以让您查看所有已编译函数的机器代码的所有版本,尽管这可能是矫枉过正。还有--print-opt-code

最后,使用 d8 --help 看看 v8 可以采取哪些其他有用的选项。