【发布时间】:2016-10-05 11:20:03
【问题描述】:
我知道像 String(1234) 和 Number("1234") 这样的类型转换更简洁更好,但我只是尝试对做同样事情的替代方法进行基准测试,特别是 "" + 1234 // -> "1234" 和 - - "1234" // -> 1234。
结果非常令人惊讶(对我来说)。我在 Chrome 中对每种方式进行了 100,000,000 次迭代。
我使用了这个简单的代码。
var then = Date.now();
for (var i = 0; i < 100000000; ++i) {
var a = - - "1234";
};
console.log(Date.now() - then);
Number("1234") 用了 2351 毫秒,而- - "1234" 只用了 748 毫秒。
反过来,String(1234) 用了 3701 毫秒,而"" + 1234 只用了 893 毫秒。
差异惊人的巨大。
我的问题是:是什么让显式转换比隐式转换慢得多?我的直觉告诉我应该反过来。
使用隐式转换是一个好习惯吗?尤其是 hacky - - "1234"?有更好的选择吗?
PS:我刚刚在 Firefox 中尝试过。它慢了大约 500 倍(但隐式转换仍然快得多)。到底是怎么回事?它是否连接到分支预测或类似的东西?我想我的基准测试错误。
【问题讨论】:
-
- - "1234"可以写成+ "1234" -
这些不是强制转换,它们是实例化。您尚未展示您的基准测试代码,但运行时可能更擅长处理和优化常量表达式与实例化的数量。
-
@andlrc 如果这样写,它会返回数字。但是如果在像
123 + "123"这样的表达式中,它会返回"123123"。你可以把它写成123 + + "123",但我觉得它和123 - - "123"很相似 -
@BoltKey——但你永远不会真的这么写,表达式更有可能是
1234 - x,在这种情况下,-运算符将 x 转换为 Number anway (*和/也是如此)。唯一需要显式转换的是+运算符,所以只有1234 + +x之类的东西。 -
查看您的代码,这似乎主要是我所怀疑的。
- - "1234"很早就可以识别为常量表达式。那只是数字 1234。它被创建了一次。您的另一个变体实际上要求实例化无数 Number 对象,然后将其丢弃。
标签: javascript performance type-conversion