首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >V8到底是如何优化/内联的?

V8到底是如何优化/内联的?
EN

Stack Overflow用户
提问于 2011-11-07 01:58:37
回答 2查看 3.8K关注 0票数 19

我想知道是否有可能了解V8到底是如何优化和内联的。

我创建了三个简单的test functions,它们都以度为单位计算角度的正弦。我将它们都放入闭包中,以便V8能够内联本地变量。

使用预先计算的常量

  • Math.PI / 180,然后执行Math.sin(x * constant).

我使用了以下代码:

代码语言:javascript
运行
复制
var test1 = (function() {
  var constant = Math.PI / 180; // only calculate the constant once

  return function(x) {
    return Math.sin(x * constant);
  };
})();

  1. 动态计算常量。

代码语言:javascript
运行
复制
var test2 = (function() {
  var pi = Math.PI; // so that the compiler knows pi cannot change
                    // and it can inline it (Math.PI could change
                    // at any time, but pi cannot)

  return function(x) {
    return Math.sin(x * pi / 180);
  };
})();

  1. 使用文字数字并动态计算常量。

代码语言:javascript
运行
复制
var test3 = (function() {
  return function(x) {
    return Math.sin(x * 3.141592653589793 / 180);
  };
})();

令人惊讶的是,结果如下:

代码语言:javascript
运行
复制
test1 - 25,090,305 ops/sec
test2 - 16,919,787 ops/sec
test3 - 16,919,787 ops/sec

看起来pi确实在test2中被内联,因为test2test3导致的每秒操作量完全相同。

另一方面,除法似乎没有得到优化(即预先计算),因为test1的速度要快得多。

  • 如果在这种情况下不手动计算,为什么不预先计算常量?
  • 可以看到V8如何精确地优化特定网页上的函数吗?
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8029106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档