JavaScript charAt() 运行时
JavaScript charAt() runtime
JavaScript 中的 charAt()
函数相对于字符串长度的运行时复杂度是多少?它是在 EcmaScript 中定义的吗(我没找到)?如果不是,常见浏览器的行为是什么?
这是一个小实验:我生成不同长度的文本并执行 charAt
一百万次。
function repeat(text, n) {
const randomPositions = [];
for (let i = 0; i < n; i++) {
randomPositions.push(Math.floor(Math.random() * text.length));
}
const t0 = performance.now();
for (let pos of randomPositions) {
text.charAt(pos);
}
console.log("Elapsed time: " + (performance.now() - t0) + " ms")
}
const characters ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
// Thanks https://www.programiz.com/javascript/examples/generate-random-strings
function generateString(length) {
let result = '';
const charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
[10**2, 10**3, 10**4, 10**5, 10**6, 10**7].forEach(l => repeat(generateString(l), 10000000));
我 运行 它在 Chrome 91、Firefox 89 和 Safari 14 中。
结果:
在 Chrome 和 Firefox 中,所需时间似乎与指示 O(1) 的文本长度没有很强的相关性。一些示例时间:
# Chrome:
Elapsed time: 37.40000003576279 ms
Elapsed time: 39.5 ms
Elapsed time: 38.30000001192093 ms
Elapsed time: 39.40000003576279 ms
Elapsed time: 46.39999997615814 ms
Elapsed time: 45.89999997615814 ms
# Firefox
Elapsed time: 255 ms
Elapsed time: 224 ms
Elapsed time: 269 ms
Elapsed time: 227 ms
Elapsed time: 424 ms
Elapsed time: 393 ms
在 Safari 中,所需时间增加:
Elapsed time: 94.00000000005821 ms
Elapsed time: 83.0000000000291 ms
Elapsed time: 93 ms
Elapsed time: 128 ms
Elapsed time: 294 ms
Elapsed time: 571 ms
我是不是漏掉了一个重要的因素?请告诉我!
JavaScript 中的 charAt()
函数相对于字符串长度的运行时复杂度是多少?它是在 EcmaScript 中定义的吗(我没找到)?如果不是,常见浏览器的行为是什么?
这是一个小实验:我生成不同长度的文本并执行 charAt
一百万次。
function repeat(text, n) {
const randomPositions = [];
for (let i = 0; i < n; i++) {
randomPositions.push(Math.floor(Math.random() * text.length));
}
const t0 = performance.now();
for (let pos of randomPositions) {
text.charAt(pos);
}
console.log("Elapsed time: " + (performance.now() - t0) + " ms")
}
const characters ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
// Thanks https://www.programiz.com/javascript/examples/generate-random-strings
function generateString(length) {
let result = '';
const charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
[10**2, 10**3, 10**4, 10**5, 10**6, 10**7].forEach(l => repeat(generateString(l), 10000000));
我 运行 它在 Chrome 91、Firefox 89 和 Safari 14 中。
结果:
在 Chrome 和 Firefox 中,所需时间似乎与指示 O(1) 的文本长度没有很强的相关性。一些示例时间:
# Chrome:
Elapsed time: 37.40000003576279 ms
Elapsed time: 39.5 ms
Elapsed time: 38.30000001192093 ms
Elapsed time: 39.40000003576279 ms
Elapsed time: 46.39999997615814 ms
Elapsed time: 45.89999997615814 ms
# Firefox
Elapsed time: 255 ms
Elapsed time: 224 ms
Elapsed time: 269 ms
Elapsed time: 227 ms
Elapsed time: 424 ms
Elapsed time: 393 ms
在 Safari 中,所需时间增加:
Elapsed time: 94.00000000005821 ms
Elapsed time: 83.0000000000291 ms
Elapsed time: 93 ms
Elapsed time: 128 ms
Elapsed time: 294 ms
Elapsed time: 571 ms
我是不是漏掉了一个重要的因素?请告诉我!