const vs inline string literal,编译优化

时间:2017-01-19 13:27:46

标签: javascript const v8 compiler-optimization

这个问题不是问题,而是基于代码结构的V8优化探索。

另一位开发人员和我正在讨论V8编译优化中 const字符串文字与内联字符串文字的价值。 当然,假设我们总是处于严格模式

以下是一些代码示例:

常量

const NAME = "something";
function doSomething(s) {
  return NAME + s;
}

VS

内联字符串

function doSomething(s) {
  return "something" + s;
}

我们同意:
- const为魔术值提供更多上下文,这样可以简化维护。

我们不同意:

  • 我说使用 const 允许V8进行编译时 因为保证了常量,所以对代码进行了优化 价值不能改变。

  • 他说,对于V8编译器,内联字符串 litteral是相同的(如果不是更好,因为间接减少)。因为在引用这样的内联字符串时可以同样应用相同的优化。

给它一点思考我倾向于同意他......每次调用函数时都会重新实例化字符串文字,但是V8可以很容易地对其进行优化,并避免后续调用。但是,我并不是所有关于编译器和编译器优化的知识都很熟悉。

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:10)

V8开发人员。

即使在未经优化的代码中,内联字符串也在所有函数调用中共享,因此无需担心重新实例化。 一般来说,JS引擎弄清楚文字永远不会改变(因为它们是文字,呃!)是微不足道的。 const提供的保证不如您想象的那么多,因为JavaScript很复杂(例如:

function makeFunction(val) { 
  const NAME = val; 
  function doSomething(s) { 
    return NAME + s;
  }
  return doSomething;
}
var doSomething = makeFunction("something");
var doAnything = makeFunction("anything, really");

在这里,const NAME并不是你直觉所说的常量;-))。

尽管如此,两种方法之间的差异可能太小而无关紧要。做任何更有意义的代码。

旁注:对于比字符串或数字更复杂的对象,情况会有所不同。例如。这样:

function getSomething() { return "something"; }
function doSomething(s) { return getSomething() + s; }

显然比这更有效:

function doSomething(s) {
  function getSomething() { return "something"; }
  return getSomething() + s;
}

因为在这种情况下,JS引擎必须创建“getSomething”的新实例(或花费大量实现+计算工作,以确定可以避免这样做;我不会依赖它)。 差异是由于对象身份的可观察性:

"a" === "a"  // true
(function f() {}) === (function f() {})  // false