当前位置:  开发笔记 > 编程语言 > 正文

const vs inline string literal,编译优化

如何解决《constvsinlinestringliteral,编译优化》经验,为你挑选了1个好方法。

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


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

以下是一些放在上下文中的代码示例:

常量

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

VS

内联字符串

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

我们的共识是:
- const为魔术值提供了更多的上下文,从而简化了维护.

我们不同意的是:

我说使用const允许V8对代码进行编译时优化,因为可以保证常量值不会改变.

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

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

任何人都可以对此有所了解吗?



1> jmrk..:

V8开发人员在这里.

内联字符串在所有函数调用中共享,即使在未经优化的代码中也是如此,因此无需担心重新实例化.一般来说,JS引擎弄清楚文字永远不会改变(因为它们是文字,呃!)是微不足道的.A 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

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有