ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 为什么隐式转换比JS中的显式快得多?隐式铸造是一种好的做法吗?

2019-05-27 23:28:03  阅读:181  来源: 互联网

标签:javascript type-conversion performance


我知道像String(1234)和Number(“1234”)这样的类型会更清晰,更好,但我只是尝试对同样的事情进行基准测试,特别是“”1234 // – > “1234”和 – – “1234”// – > 1234.

结果非常令人惊讶(对我而言).我在Chrome中每次迭代100,000次.

我使用了这个简单的代码.

var then = Date.now(); 
for (var i = 0; i < 100000000; ++i) {
    var a = - - "1234";
}; 
console.log(Date.now() - then);

数字(“1234”)花费了2351毫秒而 – “1234”只花了748毫秒.

类似地,换句话说,String(1234)花了3701 ms,而“1234只花了893 ms.

差异非常大.

我的问题是:是什么使得显式转换比隐式更慢?我的直觉告诉我它应该是另一种方式.

使用隐式强制转换是一种好习惯吗?特别是hacky – – “1234”?还有更好的选择吗?

PS:我在Firefox中尝试过同样的方法.它大约慢了500倍(但隐式转换仍然快得多).到底是怎么回事?它是否与分支预测或类似的东西相关联?我想我的基准测试错了.

解决方法:

如果您不使用常量,如果您使用i instant,那么结果将完全不同:

console.time('a');
for (var i = 0; i < 1e7; ++i) {
    var a = String(i);
}; 
console.timeEnd('a');
console.time('b');
for (var i = 0; i < 1e7; ++i) {
    var a = "" + i;
}; 
console.timeEnd('b');

输出:

a: 1062.192ms
b: 884.535ms

注意我也必须删除10的幂. 100000000 === 1e8我使用1e7.

这表明,在基准测试中使用常量时会发生很多优化.

而现在Number(…)似乎更快:

console.time('a');
for (var i = 0; i < 1e7; ++i) {
    var a = - - ("" + i);
}; 
console.timeEnd('a');
console.time('b');
for (var i = 0; i < 1e7; ++i) {
    var a = Number("" + i);
}; 
console.timeEnd('b');

输出:

a: 2010.903ms
b: 1557.735ms

标签:javascript,type-conversion,performance
来源: https://codeday.me/bug/20190527/1166633.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有