当 运行 V8 时,如何判断 javascript 已被编译

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

我有 herd V8 编译 "hot code" 优化 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 可以采用的其他有用选项。