【问题标题】:Why concat empty character is faster than .toString()?为什么 concat 空字符比 .toString() 快?
【发布时间】:2013-02-17 07:04:18
【问题描述】:

我有这个代码:

var boo = 123123;

我想将该数字转换为字符串,并且 conact string 比原生 JavaScript .toString() 更快:

更快

var foo = boo + ""; 

更慢

var foo = boo.toString(); 

jsPerf:http://jsperf.com/concat-string-vs-tostring

为什么 .toString() 比连接空字符慢?最后我想知道使用+ "" 技术而不是.toString() 的正确方法是什么?

【问题讨论】:

  • 我希望必须查找 Number 原型的函数调用的开销比 plus 运算符的内置字符串连接重载要慢。
  • 是的,它是完全有效的,尽管您应该考虑可读性比脚本执行时间中的微秒更重要。
  • @FabrícioMatté AFAIK 所有的 Java 程序员都使用boo + ""!你认为它不是人类可读的吗?
  • @Afshin,你能一眼看出这是转换为字符串吗?
  • 基准测试结果可能会由于某些运行时优化技术而失真,因为重复操作总是产生相同的结果。您可能想改用this benchmark

标签: javascript performance algorithm optimization


【解决方案1】:

结果会因使用的 javascript 引擎而异。在 chrome one 上,我得到的结果与 Afshin 相同。

那么为什么实际上一个比另一个慢?这是因为在toString 上,V8 中将再调用一次 C 函数。你可以自己试试看:

  • 在 chrome 中打开空白标签(以避免已打开页面的任何副作用)
  • 打开开发者工具
  • 打开配置文件选项卡并开始新配置文件
  • 转到控制台选项卡并插入script1 脚本,按回车键。
  • 再次转到配置文件并停止配置文件
  • script2重复同样的操作

  • 脚本 1:var boo = 123123; var foo = boo + "";

  • 脚本 2:var boo = 123123; var foo = boo.toString();

在我的情况下,首先将导致下一个堆栈跟踪:

  InjectedScript.evaluate
    InjectedScript._evaluateAndWrap

第二个:

  InjectedScript.evaluate
    InjectedScript._evaluateAndWrap
      InjectedScript._evaluateOn
        evaluate

我认为它更多地与引擎内部有关,而不是官方 js 规范,并且可能可以优化为使用相同的代码路径。

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 2015-01-18
    • 2011-06-21
    • 2012-02-09
    • 2014-04-03
    • 2016-12-26
    • 1970-01-01
    • 2022-09-29
    • 2011-04-07
    相关资源
    最近更新 更多