gpt4 book ai didi

javascript - 为什么 Node.js 中 str.charAt(i) 比 str[i] 快 1.6 倍

转载 作者:太空宇宙 更新时间:2023-11-03 22:36:36 24 4
gpt4 key购买 nike

var s = '', ok = ' h dfb  ds84 78sgf  ydf hjb////**', lc = 0, cc = 0

for (var i = 0; i < 300000; i++) {
s += ok[Math.floor(Math.random() * ok.length)]
}

console.time('[]')
for (var i = 0; i < s.length; i++) {
if (s[i] == '/' && s[i+1] == '/') lc++, i++
if (s[i] == '/' && s[i+1] == '*') cc++, i++
}
console.timeEnd('[]')
/*
console.time('charAt')
for (var i = 0; i < s.length; i++) {
if (s.charAt(i) == '/' && s.charAt(i+1) == '/') lc++, i++
if (s.charAt(i) == '/' && s.charAt(i+1) == '*') cc++, i++
}
console.timeEnd('charAt')
*/
console.time('regex')
var rlc = (s.match(/\/\//g) || []).length;
var rcc = (s.match(/\/\*/g) || []).length;
console.timeEnd('regex')

console.log(lc, cc, rlc==lc, rcc==cc)

为什么 str.charAt() 始终比 str[] 表现出约 1.6 的性能提升?他们不应该以同样的方式做同样的事情吗? [] 是否做了一些影响速度的额外检查或转换?还是与我的代码有关?

此外,为什么 str.charCodeAt(i) == 42str.charAt(i) == '/' 还要快 10%?从 C/C++ 的 Angular 来看,这完全没有意义。

更新:我将整个测试代码放在这里。

更新2:我必须说这是使用 Node.js 版本 0.11.4 观察到的

http://jsperf.com/brackets-vs-charat3此测试用例显示较小的差异。 charAt() 在 chrome 37 中慢 6%,在 Firefox 33 中快 1%。所有 Ubuntu 64。

更新3,因为这似乎是Node.js问题,所以我添加了node.js标签

最佳答案

Aren't they supposed to do the same thing the same way?

没有。除了明显不同的方式之外,他们做的事情并不相同。检查spec for charAtfor [] on strings .

Does [] do some extra checks or conversions that affect speed?

显然。不同之处在于 charAt 需要将其操作数转换为字符串,而 [] 不需要这样做。此外,对于越界访问,charAt 将返回空字符串,而 [] 将返回 undefined。大多数情况下,[] 需要检查给定的属性名称是否确实是一个整数,以及字符串对象上是否存在具有该名称的实际属性

Or is it rather about my code?

您的代码看起来不错。

Furthermore why str.charCodeAt(i) == 42 is another 10% faster than str.charAt(i) == '/'? From C/C++ point of view it makes no sense at all.

请注意,JavaScript 没有 char 数据类型。 '/' 是一个长度为 1 的字符串。看起来这没有很好地优化(或者:很容易),并且整数1比较是只是比字符串比较快。

1:大多数数字,尽管“按照规范”是 64 位 float ,但在 V8 中表示为 31 位整数。

关于javascript - 为什么 Node.js 中 str.charAt(i) 比 str[i] 快 1.6 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27144918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com