【发布时间】:2021-12-18 02:27:09
【问题描述】:
故事
在对性能关键代码进行一些测试期间,我观察到了 Math.random() 的副作用,我不明白。我在找
- 一些深入的技术解释
- 伪造我的测试(或期望)
- 链接到 V8 问题/错误票证
问题
看起来调用Math.random() 分配了一些需要由 Gargabe 收集器 (gc) 清理的内存。
测试:使用 Math.random()
const numberOfWrites = 100;
const obj = {
value: 0
};
let i = 0;
function test() {
for(i = 0; i < numberOfWrites; i++) {
obj.value = Math.random();
}
}
window.addEventListener('DOMContentLoaded', () => {
setInterval(() => {
test();
}, 10);
});
观察 1:Chrome 配置文件
Chrome:95.0.463869,Windows 10,Edge:95.0.1020.40
在浏览器中运行此代码并记录性能配置文件将导致经典的记忆之字形
Memory profile of Math.random() test
观察 2:火狐
Firefox 开发者:95,Windows 10
未检测到垃圾收集 (CC/GCMinor) - 内存相当线性
解决方法
crypto.getRandomValues()
使用 self.crypto.getRandomValues` 将 Math.random() 替换为足够大的预先计算的随机数数组。
【问题讨论】:
标签: javascript performance random garbage-collection v8